给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586 468711654886
Output示例
537643802472
上一篇简单版大数加法,但上一篇代码不怎么好。
这个大数加法想了好长时间终于做了出来。。不容易啊。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char a[10050],b[10050]; int la,lb,flag=0,temp=0; bool cmp() { for(int i=la-1;i>=0;i--) if(a[i]>b[i]) return 1; else return 0; } int fun() { if(la==lb) return cmp(); return la>lb; } int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); cin>>a>>b; la=strlen(a); lb=strlen(b); for(int i=0;i<la;i++) a[i]-='0';//首先把字符数组变成数组 for(int i=0;i<lb;i++) b[i]-='0';//同上 reverse(a,a+la); reverse(b,b+lb); int mas=la>lb?la:lb; if(a[la-1]==-3||b[lb-1]==-3) { if(a[la-1]==b[lb-1]) { a[la-1]=b[lb-1]=0; flag=3;//flag记录两数相加的类型(正正,正负,负正,负负) la--; lb--; } else { if(a[la-1]==-3) { a[--la]=0; temp=1;//temp记录一正一负相加时结果的正负 } else if(b[lb-1]==-3) { b[--lb]=0; temp=0; } if(fun())flag=1; else flag=2; } } if(flag==1) { for(int i=0;i<mas;i++) a[i]-=b[i];//一正一负时求取绝对值差值 } else if(flag==2) { for(int i=0;i<mas;i++) a[i]=b[i]-a[i];//同上 } else { for(int i=0;i<mas;i++) a[i]+=b[i];//符号一致时直接相加 } for(int i=0;i<mas;i++)//进位,借位 { if(a[i]<0) { while(a[i]<0) { a[i]+=10; a[i+1]-=1; } } else if(a[i]>9) { while(a[i]>9) { a[i]-=10; a[i+1]+=1; } } } while(a[mas]==0&&mas>0)mas--;//消去前缀0,同时保证结果为0时输出0 if(temp&&flag==1||!temp&&flag==2||flag==3)cout<<'-';//如果结果为负,首先输出负号 for(int i=mas;i>=0;i--) cout<<(int)a[i]; cout<<endl; return 0; }