1.两个非负大数相加:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int L=110; string add(string a,string b)//只限两个非负整数相加 { string ans; int na[L]={0},nb[L]={0}; int la=a.size(); int lb=b.size(); // 倒叙存储 for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0'; // 倒叙存储 for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0'; int lmax=la>lb?la:lb; // 从个位开始计算 for(int i=0;i<lmax;i++) { na[i]+=nb[i]; na[i+1]+=na[i]/10; na[i]%=10; } // 去除前置0 if(!na[lmax]) lmax--; for(int i=lmax;i>=0;i--) ans+=na[i]+'0'; return ans; } int main() { string a,b; while(cin>>a>>b) cout<<add(a,b)<<endl; return 0; }
2.一正一负相加:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <iostream> #include <cstring> using namespace std; const int maxn = 10010; char a[maxn],b[maxn]; int aa[maxn],bb[maxn]; void add(char str1[],char str2[]) { memset(aa,0, sizeof(aa)); memset(bb,0, sizeof(bb)); int len1 = strlen(str1); int len2 = strlen(str2); int flag1 = 0,flag2 = 0; // 都是0的时候特殊处理 if (str1[0] == '0' && str2[0] == '0') printf("0\n"); else { // str1是负数 if (str1[0] == '-') { flag1 = 1; for (int i=0;i<len1-1;i++) { aa[i] = str1[len1-1-i] - '0'; //倒叙记录 } } else { // str1是正数 for (int i=0;i<len1;i++) { aa[i] = str1[len1-1-i] -'0'; } } //str2是负数 if (str2[0] == '-') { flag2 = 1; for (int i=0;i<len2-1;i++) { bb[i] = str2[len2-1-i] - '0'; } } else { // str2是正数 for (int i=0;i<len2;i++) { bb[i] = str2[len2-1-i]- '0'; } } //分四种情况对str1,str2处理 if (!flag1 && !flag2) //str1 和 str2都是正数 { int len = max(len1,len2); for (int i=0;i<len;i++) { bb[i] += aa[i]; bb[i+1] += bb[i]/10; bb[i]%=10; } //处理前置零 while (!bb[len]) len--; for (;len>=0;len--) printf("%d",bb[len]); printf("\n"); } else if (!flag1 && flag2) // str1是正数,str2是负数 { int ans = 0; //判断str1和str2的绝对值谁大谁小 if (len1>len2-1) ans = 1; else if (len1 == len2-1) { for (int i=len1-1;i>=0;i--) { if (aa[i]>bb[i]) { ans = 1; break; } else if (aa[i]<bb[i]) { ans = 0; break; } } } // 如果str1的绝对值更大 if (ans) { for (int i=0;i<len1;i++) { aa[i] -= bb[i]; while (aa[i]<0) { aa[i] += 10; aa[i+1]--; } } //处理前置零 while (!aa[len1]) len1--; for (;len1>=0;len1--) printf("%d",aa[len1]); printf("\n"); } else // 如果str2的绝对值更大 { for (int i=0;i<len2-1;i++) { bb[i] -= aa[i]; while (bb[i]<0) { bb[i]+=10; bb[i+1]--; } } //处理前置零 while (!bb[len2]) len2--; if (len2<0) // 注意333 -333 的情况 printf("0\n"); else { for (;len2>=0;len2--) printf("%d",bb[len2]); printf("\n"); } } } else if (flag1 && !flag2) //str1为负数 str2为正数 { int ans = 0; // 判断str1 和 str2 的绝对值的大小 if (len2>len1-1) { ans = 1; } else if (len2 == len1-1) { for (int i = len2 - 1; i >= 0; i--) { if (aa[i] > bb[i]) { ans = 0; break; } else if (bb[i] > aa[i]) { ans = 1; break; } } } //判断结果的正负 if (ans) { for (int i=0;i<len2;i++) { bb[i] -= aa[i]; while (bb[i]<0) { bb[i]+=10; bb[i+1]--; } } //处理前置0 while (!bb[len2]) len2--; for (;len2>=0;len2--) printf("%d",bb[len2]); printf("\n"); } else { for (int i=0;i<len1-1;i++) { aa[i] -= bb[i]; while (aa[i]<0) { aa[i]+=10; aa[i+1]--; } } //处理前置0 while (!aa[len1]) len1--; if (len1<0) // 注意333 -333 的情况 printf("0\n"); else { printf("-"); for (;len1>=0;len1--) { printf("%d",aa[len1]); } printf("\n"); } } } else if (flag1 && flag2) // 都是负数 { printf("-"); int len = max(len1,len2); for (int i=0;i<len-1;i++) { bb[i] += aa[i]; bb[i+1] += bb[i]/10; bb[i]%=10; } while (!bb[len]) len--; for (;len>=0;len--) printf("%d",bb[len]); printf("\n"); } } } int main() { while (cin >> a >> b) { add(a,b); } return 0; }