/**
* 功能:实现整数的乘法、减法和除法运算。只允许使用加号。
*/
[java] view plain copy
- //减法
- public static int minus(int a,int b){
- return a+negate(b);
- }
- //取反
- /**
- * 思路:对正数k的取反,只需要将-1连续加k次;对负数k的取反,只需要将1连续加k次。
- * @param a
- * @return
- */
- public static int negate(int a){
- int neg=0;
- int d=a>0?-1:1;
- while(a!=0){
- neg+=d;
- a+=d;
- }
- return neg;
- }
- //乘法
- /**
- * 思路:a乘以b,即为a连续加b次。
- * @param a
- * @param b
- * @return
- */
- public static int multiply(int a,int b){
- if(a<b)
- return multiply(b,a);
- int sum=0;
- for(int i=abs(b);i>0;i--){
- sum+=a;
- }
- if(b<0)
- sum=negate(sum);
- return sum;
- }
- //取绝对值
- /**
- * 思路:即对负数取反。
- * @param a
- * @return
- */
- public static int abs(int a){
- if(a<0)
- return negate(a);
- else
- return a;
- }
- //除法
- /**
- * 思路:利用等式a=xb,将b与其自身连加直至得到a,就能算出x的值。x的值为b连加的次数。
- * 注意:若a不能被b整除,对于整数除法,即对结果向下取舍。
- * @param a
- * @param b
- * @return
- * @throws java.lang.ArithmeticException
- */
- public static int divide(int a,int b) throws java.lang.ArithmeticException{
- if(b==0){
- throw new java.lang.ArithmeticException("Error");
- }
- 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);
- }
或者:
解题思路:题目要求只允许使用加号,我想意思指的是不能直接使用乘、减、除等运算符,而比较运算符等其他运算符还是可以使用的。
1. a*b:将问题转换成|b|个a相加,或者|a|个b相加,最后根据a、b的符号确定返回值的符号。
2. a-b:转化成a+[-b]补,而[b]补与[-b]补之间的转换关系:连同符号位一起按位取反,再加1。
3. a/b: 问题转化成b*x = a,情形与1类似。
1 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 |
|