题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
思路:简化版的话,我认为只有正整数的话,那么直接可以用大数加法的原理来解决这个问题,整体思路就是考虑进位,同时作为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); }