實現整數的乘法、減法和除法運算,只容許使用加號

/**java

 * 功能:實現整數的乘法、減法和除法運算。只容許使用加號。app

 */ide

 

[java] view plain copyspa

 

  1. //減法  
  2.     public static int minus(int a,int b){  
  3.         return a+negate(b);  
  4.     }  
  5.       
  6.     //取反  
  7.     /** 
  8.      * 思路:對正數k的取反,只須要將-1連續加k次;對負數k的取反,只須要將1連續加k次。 
  9.      * @param a 
  10.      * @return 
  11.      */  
  12.     public static int negate(int a){  
  13.         int neg=0;  
  14.         int d=a>0?-1:1;  
  15.         while(a!=0){  
  16.             neg+=d;  
  17.             a+=d;             
  18.         }  
  19.         return neg;  
  20.     }  
  21.       
  22.     //乘法  
  23.     /** 
  24.      * 思路:a乘以b,即爲a連續加b次。 
  25.      * @param a 
  26.      * @param b 
  27.      * @return 
  28.      */  
  29.     public static int multiply(int a,int b){  
  30.         if(a<b)  
  31.             return multiply(b,a);  
  32.           
  33.         int sum=0;        
  34.         for(int i=abs(b);i>0;i--){  
  35.             sum+=a;  
  36.         }  
  37.           
  38.         if(b<0)  
  39.             sum=negate(sum);  
  40.           
  41.         return sum;  
  42.     }  
  43.       
  44.     //取絕對值  
  45.     /** 
  46.      * 思路:即對負數取反。 
  47.      * @param a 
  48.      * @return 
  49.      */  
  50.     public static int abs(int a){  
  51.         if(a<0)  
  52.             return negate(a);  
  53.         else   
  54.             return a;  
  55.     }  
  56.       
  57.     //除法  
  58.     /** 
  59.      * 思路:利用等式a=xb,將b與其自身連加直至獲得a,就能算出x的值。x的值爲b連加的次數。 
  60.      * 注意:若a不能被b整除,對於整數除法,即對結果向下取捨。 
  61.      * @param a 
  62.      * @param b 
  63.      * @return 
  64.      * @throws java.lang.ArithmeticException 
  65.      */  
  66.     public static int divide(int a,int b) throws java.lang.ArithmeticException{  
  67.         if(b==0){  
  68.             throw new java.lang.ArithmeticException("Error");  
  69.         }  
  70.           
  71.         int absa=abs(a);  
  72.         int absb=abs(b);  
  73.           
  74.         int product=0;  
  75.         int x=0;  
  76.         while(product+absb<=absa){  
  77.             product+=absb;  
  78.             x++;  
  79.         }  
  80.           
  81.         if(a<0&&b<0||a>0&&b>0)  
  82.             return x;  
  83.         else  
  84.             return negate(x);  
  85.     }

或者:.net

解題思路:題目要求只容許使用加號,我想意思指的是不能直接使用乘、減、除等運算符,而比較運算符等其餘運算符仍是能夠使用的。code

1. a*b:將問題轉換成|b|個a相加,或者|a|個b相加,最後根據a、b的符號肯定返回值的符號。blog

2.  a-b:轉化成a+[-b]補,而[b]補與[-b]補之間的轉換關係:連同符號位一塊兒按位取反,再加1。ip

3. a/b: 問題轉化成b*x = a,情形與1相似。ci

1get

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

public int calc(int a, int b, int type) {

    if (!(type == 1 || type == 0 || type == -1))

        throw new RuntimeException("Invalid Input");

    switch (type) {

    case 1:

        return multiply(a, b);

    case 0:

        return divide(a, b);

    default:

        return minus(a, b);

    }

}

 

public int multiply(int a, int b) {

    if(b==0)// 與0相乘,返回0

        return 0;

    // 將問題轉換成b個a相加

    if(Math.abs(a)<Math.abs(b)){// b取絕對值的較小者,能夠加速運算

        int tmp = a;

        a = b;

        b = tmp;

    }

    int sum = 0;

    for (int i = 1; i <= Math.abs(b); i++) {

        sum+=a;

    }

    // 肯定返回值的符號    

    return b>0?sum:(~sum)+1;

}

 

public int minus(int a, int b) {

    // a-b轉化成a+[-b]補,而[b]補與[-b]補之間的轉換關係:連同符號位一塊兒按位取反,再加1。

    int rb = (~b)+1;

    return a+rb;

}

 

public int divide(int a, int b) {

    if(b==0)

        throw new RuntimeException("b cannot be 0");

    // 問題轉化成b*x = a

    int sum = 0,count = 0;

    while(sum<Math.abs(a)){

        sum += Math.abs(b);

        count++;

    }

    sum = sum>Math.abs(a)?--count:count;

    // 若a、b同號則返回正數

    return ((a>>31)^(b>>31))==0?count:(~count)+1;

}

相關文章
相關標籤/搜索