אפשר רק להוסיף
יש לממש חיסור, כפל וחילוק כאשר פעולה המותרת - רק הוספה.
קודם כל נעשה דבר פשוט ביותר. חיסור: נגיד וננסה להוסיף 1- k פעמים. זה לא כל כך יעיל. לכן אנחנו כל פעם נחפיל את המספר שמוריידים:
- int negate(int a) {
- int neg = 0;
- int newSign = a < 0 ? 1 : -1 ;
- int delta = newSign;
- while(a != 0 ){
- bool differentSign = (a + delta > 0 ) != (a > 0);
- if(a + delta != 0 && differentSign) { //delta too big, lets reset
- delta = newSign;
- }
- neg += delta;
- a += delta;
- delta += delta;
- }
- return neg;
- }
- int minus (int a, int b) {
- return a + negate(b);
- }
זמן ריצה של הקוד יהיה
O log(a)
עכשיו נעשה הכפלה:
- int multiply(int a, int b) {
- if(a < b)
- return multiply (b, a); //will be faster if b < a
- int sum = 0;
- for(int i = abs(b); i > 0; i = minus (i, 1)) {
- sum += a;
- }
- if( b < 0) {
- sum = negate(sum);
- }
- return sum;
- }
- int abs(int a) {
- if(a < 0) {
- return negate(a);
- } else {
- return a;
- }
- }
ועכשיו הכי קשה - חילוק.
- int divide(int a, int b) {
- if(b == 0)
- throw new DivideByZeroException();
- int absa = abs(a);
- int absb = abs(b);
- int product = 0;
- int x = 0;
- while (product + absb <= absa) {
- product += absb;
- x++;
- }
- if((a < 0 && b < 0) || (a > 0 && b > 0)) {
- return x;
- } else {
- return negate(x);
- }
- }