题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
思路:简化版的话,我认为只有正整数的话,那么直接可以用大数加法的原理来解决这个问题,整体思路就是考虑进位,同时作为2进制进行加法运算
但是实现比较复杂,考虑问题比较麻烦,时间耽误比较多半个小时才写出来,坑爹啊
#include "stdio.h"
int count(int numA,int numB)
{
int data =0;
int i=0;
int a,b;
int temp;
int update =0;
a = numA;
b = numB;
while(a!=0 && b!=0)
{
if(a%2==1 && b%2 == 1)
{
if(update ==0)
{
update=1;
}
else
{
temp =1;
temp<<=i;
data |= temp;
update =1;
}
}
else if((a%2==1||b%2==1))
{
if(update ==0)
{
temp =1;
temp<<=i;
data |= temp;
}
else
{
update = 1;
}
}
else if(a%2==0&&b%2==0)
{
if(update == 1)
{
temp = 1;
temp<<=i;
data |= temp;
update =0;
}
}
a>>=1;
b>>=1;
i++;
}
if(a == 0 &&b==0&update==1)
{
temp =1;
temp <<=i;
data|=temp;
}
else if(a==0&&b!=0)
{
while(b!=0)
{
if(b%2==0)
{
if(update == 1)
{
temp =1;
temp <<=i;
data|=temp;
update = 0;
}
}
else
{
if(update == 0)
{
temp =1;
temp <<=i;
data|=temp;
}
}
i++;
b>>=1;
}
if(update ==1)
{
temp =1;
temp <<=i;
data|=temp;
}
}
else if(a!=0&&b==0)
{
while(a!=0)
{
if(a%2==0)
{
if(update == 1)
{
temp =1;
temp <<=i;
data|=temp;
update = 0;
}
}
else
{
if(update == 0)
{
temp =1;
temp <<=i;
data|=temp;
}
}
i++;
a>>=1;
}
if(update ==1)
{
temp =1;
temp <<=i;
data|=temp;
}
}
return data;
}
int main()
{
int numA;
int numB;
int total;
int index =0;
while(index++<10)
{
scanf("%d %d",&numA,&numB);
total = count(numA,numB);
printf("%d \n",total);
}
return 0;
}
然而结果是很不幸的,看了网友的方法,顿感压力巨大啊
思路一 利用++和--
int add(int m, int n){
if (n < 0)
for (int i = n; i < 0; i++)
m --;
else
for (int i = n; i > 0; i-- )
m++;
return m;
}
思路二 太牛了,直接利用地址偏移来做牛的不行了
int add(int a,int b)
{
char *c;
c = (char *)a;
return &c[b];
}
思路三 当然是海涛的思路了
拜读了海涛的大作后,顿感才华横溢啊。
先通过十进制加法来考虑
如 5+17 = 22 先,先考虑加法不进位 5+17 = 12
然后考虑进位为10.
计算前两步结果之和 12+10 = 12
为什么说好呢,因为可以移植到二进制,并用异或解决问题
例如 5-----2进制 101
17 ----2进制10001
从低到高位异或 过程如下 101 ^ 10001 ===========>10100
进位只需考虑低位 (101 &10001 )<<=1;
然后两步结果异或就行了
递归代码如下:
int add(int num1,int num2)
{
int carry;
int total;
if(num2 == 0)
return num1;
total= num1^num2;
carry = (num1&num2)<<1;
return add(total,carry);
}