#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10010; char a[maxn],b[maxn]; int aa[maxn],bb[maxn]; int main() { // freopen("a.txt","r",stdin); while(scanf("%s%s",a,b)!=EOF) { memset(aa,0,sizeof(aa)); memset(bb,0,sizeof(bb)); int l1=strlen(a),l2=strlen(b),i; int flag1=0,flag2=0; if(a[0]=='0'&&b[0]=='0') printf("0\n"); //特殊考虑a和b都为0的情况 else { if(a[0]=='-') { flag1=1; //判断 a是否是负数 是的话置标记 for(i=0;i<l1-1;i++) //然后 a[0]是负号可以不用处理 { aa[i]=a[l1-i-1]-'0'; } } else //否则 直接转换就好 { for(i=0;i<l1;i++) { aa[i]=a[l1-i-1]-'0'; } } if(b[0]=='-') //同理判断 b { flag2=1; for(i=0;i<l2-1;i++) { bb[i]=b[l2-i-1]-'0'; } } else { for(i=0;i<l2;i++) { bb[i]=b[l2-i-1]-'0'; } } int s=0,ans=0; //分四种情况 分别对a,b进行处理 if(!flag1&&!flag2) //a,b都为正数 { l1=max(l1,l2); for(i=0;i<l1;i++) { bb[i]+=aa[i]; if(bb[i]>=10) { bb[i]-=10; bb[i+1]++; } } while(!bb[l1]) l1--; for(;l1>=0;l1--) printf("%d",bb[l1]); printf("\n"); } else if(!flag1&&flag2) //a为正数,b为负数 { //判断a,b的绝对值谁大谁小 if(l1+1>l2) ans=1; //先判断长度 else if(l1+1==l2) //长度相等,判断每一位的大小 { for(i=l1-1;i>=0;i--) { if(aa[i]>bb[i]) { ans=1;break;} //当前位大于 则a>b else if(aa[i]<bb[i]) break; //否则小于 } } if(ans) //a的绝对值大于b 例如332 -3 或者 332 -331 { for(i=0;i<l1;i++) //只要循环到l1-1即可 { aa[i]-=bb[i]; if(aa[i]<0) { aa[i]+=10; aa[i+1]--; } } while(!aa[l1]) l1--; for(;l1>=0;l1--) printf("%d",aa[l1]); printf("\n"); } else //a的绝对值小于b { for(i=0;i<l2-1;i++) //循环到 l2-2 ,因为b是负数 { bb[i]-=aa[i]; if(bb[i]<0) { bb[i]+=10; bb[i+1]--; } } while(!bb[l2]) l2--; //如果此时 bb变成0,比如 333 -333的情况 if(l2<0) printf("0\n"); //输出0 else { printf("-"); //输出负号 for(;l2>=0;l2--) printf("%d",bb[l2]); printf("\n"); } } } else if(flag1&&!flag2) //和上面同理 { if(l2+1>l1) ans=1; else if(l2+1==l1) { for(i=l2-1;i>=0;i--) { if(bb[i]>aa[i]) { ans=1;break;} else if(bb[i]<aa[i])break; } } if(ans) { for(i=0;i<l2;i++) { bb[i]-=aa[i]; if(bb[i]<0) { bb[i]+=10; bb[i+1]--; } } while(!bb[l2]) l2--; for(;l2>=0;l2--) printf("%d",bb[l2]); printf("\n"); } else { for(i=0;i<l1-1;i++) { aa[i]-=bb[i]; if(aa[i]<0) { aa[i]+=10; aa[i+1]--; } } while(!aa[l1]) l1--; if(l1<0) printf("0\n"); else { printf("-"); for(;l1>=0;l1--) printf("%d",aa[l1]); printf("\n"); } } } else if(flag1&&flag2) //同为负数 { printf("-"); l1=max(l1,l2); for(i=0;i<l1-1;i++) { bb[i]+=aa[i]; s=bb[i]/10; bb[i]%=10; bb[i+1]+=s; } while(!bb[l1]) l1--; for(;l1>=0;l1--) printf("%d",bb[l1]); printf("\n"); } } } return 0; }
---------------------------------------------------------------------------------------------------------------------
#include <stdio.h> #include <string.h> #define _MAX 10005 int product[_MAX] = {0}; char numOne[_MAX] = {0}, numTwo[_MAX] = {0}; char numOneUp[_MAX] = {0}, numTwoUp[_MAX] = {0}; //倒序存储位置 int absMax = 1; //递归进位函数 void Carrying(int tag, int i, int *p) { p[i] += tag; if (p[i] > 9) { tag = 1; p[i] -= 10; Carrying(tag, i + 1, p); //写成Carrying(tag, i, j+1, p);也成立,为了让i+j递增而已 } return ; } //递归退位函数 void Abdicate(int tag, int i, int *p) { p[i] += tag; if (p[i] < 0) { tag = -1; p[i] += 10; Abdicate(tag, i + 1, p); } return ; } //判断大小 void size(int numOneLen, int numTwoLen) { int i, j; if (numOneLen < numTwoLen) { absMax = 2; for (i = 0; i < numTwoLen; i++) { numOneUp[i] ^= numTwoUp[i]; numTwoUp[i] ^= numOneUp[i]; numOneUp[i] ^= numTwoUp[i]; } return ; } if (numOneLen == numTwoLen) { for (i = numOneLen - 1; i >= 0; i--) { if (numOneUp[i] < numTwoUp[i]) { absMax = 2; for (j = 0; j < numTwoLen; j++) { numOneUp[j] ^= numTwoUp[j]; numTwoUp[j] ^= numOneUp[j]; numOneUp[j] ^= numTwoUp[j]; } return ; } else if (numOneUp[i] > numTwoUp[i]) { return ; } } } return ; } //加减处理 void addOrSub(int numOneLen, int numTwoLen, int flag) //flag加法为1减法为0 { int i, key = 0, tag, numLenMax, numLenMin; numOneLen = numOneLen - 1; numTwoLen = numTwoLen - 1; //数据逆序 for (i = numOneLen; i > 0; i--) { numOneUp[key++] = numOne[i]; } if (numOne[0] != '-') { numOneUp[key] = numOne[0]; numOneLen++; } key = 0; for (i = numTwoLen; i > 0; i--) { numTwoUp[key++] = numTwo[i]; } if (numTwo[0] != '-') { numTwoUp[key] = numTwo[0]; numTwoLen++; } numLenMax = numOneLen > numTwoLen ? numOneLen : numTwoLen; numLenMin = numOneLen < numTwoLen ? numOneLen : numTwoLen; //逐位相加 if (flag) { size(numOneLen, numTwoLen); for (i = 0; i < numLenMax; i++) { product[i] = (int)numOneUp[i] - 48; } for (i = 0; i < numLenMin; i++) { tag = (int)numTwoUp[i]-48; Carrying(tag, i, product); //递归 } } //逐位相减 else { size(numOneLen, numTwoLen); for (i = 0; i < numLenMax; i++) { product[i] = (int)numOneUp[i] - 48; } for (i = 0; i < numLenMin; i++) { tag = -((int)numTwoUp[i]-48); Abdicate(tag, i, product); //递归 } } } //输出结果 void print() { int i, j; //倒序输出结果 for (i = _MAX - 1; i > 0; i--) { if (product[i] != 0) { break; //查找到第一个不等于0的跳出 } } for (j = i; j >= 0; j--) { printf("%d",product[j]); } printf("\n"); } int main(int argc, const char * argv[]) { int numOneLen, numTwoLen; scanf("%s %s",numOne,numTwo); //存数据 numOneLen=(int)strlen(numOne); numTwoLen=(int)strlen(numTwo); if (numOne[0] == '-' && numTwo[0] == '-') { addOrSub(numOneLen, numTwoLen, 1); printf("-"); print(); } else if (numOne[0] == '-' || numTwo[0] == '-') { addOrSub(numOneLen, numTwoLen, 0); if ((numOne[0] == '-' && absMax == 1) || (numTwo[0] == '-' && absMax == 2)) { printf("-"); } print(); } else { addOrSub(numOneLen, numTwoLen, 1); print(); } return 0; }