JZ65 不用加减乘除做加法

JZ65 不用加减乘除做加法_第1张图片

【答案解析】:
十进制相加思想: 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位
嘛),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。
这里使用二进制求和完成,思想类似,但是二进制计算相加和进位不需要使用 + 符号
二进制相加思想:与十进制相同,先计算不考虑进位的相加结果( 0+0 得 0 , 1+1 进位得 0 , 1+0 得 1 ),使用
异或可以取得; 然后计算相加的进位结果(同 1 的位置左移一位即可),使用相与后左移取得。
示例:
5 0101 + 7 0111
不考虑进位的相加结果 0101^0111 -> 0010
相加的进位
0101&0111 -> 0101 因为进位左移得到 1010
1010 + 0010
不考虑进位的相加结果 1010 ^ 0010 -> 1000
相加的进位
1010 & 0010 -> 0010 因为进位左移得到 0100
1000 + 0100
不考虑进位的相加结果 1000 ^ 0100 -> 1100
相加的进位
1000 & 0100 -> 0000 进位为0结束运算

 

本人代码:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num1 int整型 
 * @param num2 int整型 
 * @return int整型
 */
int Add(int num1, int num2 ) 
{
    // write code here
    while (num2)
    {
        int tmp = num1 ^ num2;                        //^类似于不进位相加
        num2 = (num1 & num2)<<1;                 //&类似于进位器
        num1 = tmp;
    }

    return num1;
}

答案代码:

int Add(int num1, int num2 ) {
while(num2 != 0) {//进位不为0则持续与相加结果进行相加
int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
num2 = (num1 & num2) << 1;//同1的位相加则会进位
num1 = tmp;
}
return num1;
}

 

 

你可能感兴趣的:(c语言)