פבר.03

אפשר רק להוסיף

אפשר רק להוסיף

יש לממש חיסור, כפל וחילוק כאשר פעולה המותרת - רק הוספה.

קודם כל נעשה דבר פשוט ביותר. חיסור: נגיד וננסה להוסיף 1- k פעמים. זה לא כל כך יעיל. לכן אנחנו כל פעם נחפיל את המספר שמוריידים:

  1. int negate(int a) {
  2. int neg = 0;
  3. int newSign = a < 0 ? 1 : -1 ;
  4. int delta = newSign;
  5. while(a != 0 ){
  6. bool differentSign = (a + delta > 0 ) != (a > 0);
  7. if(a + delta != 0 && differentSign) { //delta too big, lets reset
  8. delta = newSign;
  9. }
  10. neg += delta;
  11. a += delta;
  12. delta += delta;
  13. }
  14. return neg;
  15. }
  16.  
  17. int minus (int a, int b) {
  18. return a + negate(b);
  19. }


זמן ריצה של הקוד יהיה 

O log(a)

עכשיו נעשה הכפלה:

  1. int multiply(int a, int b) {
  2. if(a < b)
  3. return multiply (b, a); //will be faster if b < a
  4. int sum = 0;
  5. for(int i = abs(b); i > 0; i = minus (i, 1)) {
  6. sum += a;
  7. }
  8. if( b < 0) {
  9. sum = negate(sum);
  10. }
  11. return sum;
  12. }
  13.  
  14. int abs(int a) {
  15. if(a < 0) {
  16. return negate(a);
  17. } else {
  18. return a;
  19. }
  20. }

ועכשיו הכי קשה - חילוק.

  1. int divide(int a, int b) {
  2. if(b == 0)
  3. throw new DivideByZeroException();
  4. int absa = abs(a);
  5. int absb = abs(b);
  6. int product = 0;
  7. int x = 0;
  8. while (product + absb <= absa) {
  9. product += absb;
  10. x++;
  11. }
  12. if((a < 0 && b < 0) || (a > 0 && b > 0)) {
  13. return x;
  14. } else {
  15. return negate(x);
  16. }
  17. }


תגיות:
שתף את הסיפור הזה:

תגובות(0)

השאירו תגובה

קפטצ'ה לא מתאימה

תגובה