Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. def reverse(a):
  2. '''Complexity - O(a).'''
  3. if a == 0:
  4. return 0
  5.  
  6. result = 0
  7. change = -1 if a > 0 else +1
  8.  
  9. while a != 0:
  10. result += change
  11. a += change
  12. return result
  13.  
  14. assert(reverse(-10) == 10)
  15. assert(reverse(-1) == 1)
  16. assert(reverse(-0) == 0)
  17. assert(reverse(0) == 0)
  18. assert(reverse(1) == -1)
  19. assert(reverse(10) == -10)
  20.  
  21.  
  22. def abs(a):
  23. '''Complexity - O(a) in case a is negative.'''
  24. if a >= 0:
  25. return a
  26. return reverse(a)
  27.  
  28. assert(abs(-10) == 10)
  29. assert(abs(-1) == 1)
  30. assert(abs(-0) == 0)
  31. assert(abs(0) == 0)
  32. assert(abs(1) == 1)
  33. assert(abs(10) == 10)
  34.  
  35.  
  36. def add(a, b):
  37. '''The only realized operation.'''
  38. return a + b
  39.  
  40. assert(add(-10, 10) == 0)
  41. assert(add(-10, -10) == -20)
  42. assert(add(-10, 0) == -10)
  43. assert(add(0, -10) == -10)
  44. assert(add(0, 0) == 0)
  45. assert(add(0, 10) == 10)
  46. assert(add(10, 0) == 10)
  47. assert(add(10, 10) == 20)
  48. assert(add(10, -10) == 0)
  49.  
  50.  
  51. def subtract(a, b):
  52. '''Complexity - O(b).'''
  53. return a + reverse(b)
  54.  
  55. assert(subtract(-10, 10) == -20)
  56. assert(subtract(-10, -10) == 0)
  57. assert(subtract(-10, 0) == -10)
  58. assert(subtract(0, -10) == 10)
  59. assert(subtract(0, 0) == 0)
  60. assert(subtract(0, 10) == -10)
  61. assert(subtract(10, 0) == 10)
  62. assert(subtract(10, 10) == 0)
  63. assert(subtract(10, -10) == 20)
  64.  
  65.  
  66. def multiply(a, b):
  67. '''Complexity - 2*(a + b):
  68. abs(a) -> a
  69. abs(b) -> b
  70. reverse(mx) -> max(|a|,|b|)
  71. range(mnabs) -> min(|a|,|b|)
  72. '''
  73. if not a or not b:
  74. return 0
  75.  
  76. # Searhing absolute minimum to take less loop steps below
  77. mn, mx, result = a, b, 0
  78. mnabs, mxabs = abs(a), abs(b)
  79. if mnabs > mxabs:
  80. mn, mx = mx, mn
  81. mnabs, mxabs = mxabs, mnabs
  82.  
  83. if mn < 0:
  84. mx = reverse(mx)
  85.  
  86. # Main calculation loop
  87. for i in range(mnabs):
  88. result += mx
  89. return result
  90.  
  91. assert(multiply(-10, 10) == -100)
  92. assert(multiply(-10, -10) == 100)
  93. assert(multiply(-10, 0) == 0)
  94. assert(multiply(0, -10) == 0)
  95. assert(multiply(0, 0) == 0)
  96. assert(multiply(0, 10) == 0)
  97. assert(multiply(10, 0) == 0)
  98. assert(multiply(10, 10) == 100)
  99. assert(multiply(10, -10) == -100)
  100.  
  101.  
  102. def divide(a, b):
  103. '''Division is checked by multiplication.
  104. We calculate the sign of result and operate with absolute values of a and b.
  105. Then we count how many times b is in a.
  106. Complexity - O(a + b + a//b):
  107. abs(a) -> a
  108. abs(b) -> b
  109. main loop -> a//b
  110. '''
  111. if b == 0:
  112. return 0
  113. raise Exception
  114.  
  115. absa, absb = abs(a), abs(b)
  116.  
  117. if absa < absb:
  118. return 0
  119. if a == b:
  120. return 1
  121. if absa == absb:
  122. return -1
  123.  
  124. # Sign of result
  125. change = +1 if a > 0 and b > 0 or a < 0 and b < 0 else -1
  126.  
  127. # Main calculation loop
  128. accumulator, result = 0, 0
  129. while accumulator < absa:
  130. accumulator += absb
  131. result += change
  132.  
  133. # If a mod b == 0, so we return result.
  134. if accumulator == absa:
  135. return result
  136.  
  137. # Otherwise we have made one unnecessary step and need to decrease result by 1.
  138. return subtract(result, change)
  139.  
  140. assert(divide(-1, 0) == 0)
  141. assert(divide(0, 0) == 0)
  142. assert(divide(1, 0) == 0)
  143.  
  144. assert(divide(0, 1) == 0)
  145. assert(divide(0, -1) == 0)
  146.  
  147. assert(divide(-2, -2) == 1)
  148. assert(divide(-1, -1) == 1)
  149. assert(divide(1, 1) == 1)
  150. assert(divide(2, 2) == 1)
  151.  
  152. assert(divide(-2, 2) == -1)
  153. assert(divide(-1, 1) == -1)
  154. assert(divide(1, -1) == -1)
  155. assert(divide(2, -2) == -1)
  156.  
  157. assert(divide(-1, -2) == 0)
  158. assert(divide(-1, 2) == 0)
  159. assert(divide(1, -2) == 0)
  160. assert(divide(1, 2) == 0)
  161.  
  162. assert(divide(-2, -1) == 2)
  163. assert(divide(-2, 1) == -2)
  164. assert(divide(2, -1) == -2)
  165. assert(divide(2, 1) == 2)
  166.  
  167. assert(divide(-5, -2) == 2)
  168. assert(divide(-5, 2) == -2)
  169. assert(divide(5, -2) == -2)
  170. assert(divide(5, 2) == 2)
  171.  
  172. assert(divide(-5, -3) == 1)
  173. assert(divide(-5, 3) == -1)
  174. assert(divide(5, -3) == -1)
  175. assert(divide(5, 3) == 1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement