51Nod 1005 大数加法

来源:互联网 发布:单片机与modbus 编辑:程序博客网 时间:2024/06/06 07:27

1005大数加法
基准时间限制:1 秒 空间限制:131072 KB 分值:0难度:基础题
收藏
关注
取消关注
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A第2行:大数B(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586468711654886
Output示例
537643802472

这题不好做就是在负数上,要处理负数。例如 13   -14有可能就会计算成-99

我的做法是不看符号,把数大的放在前面统一处理,加法简单,减法注意符号

#include<iostream>#include<algorithm>#include<map>#include<cstring>#include<vector>#include<cmath>using namespace std;int main(){char s1[100001],s2[100001];scanf("%s %s",s1,s2);int a[100001]={0},b[100001]={0},n=0,m=0;int fz1=0,fz2=0;if(s1[0]=='0'&&s2[0]=='0'){cout<<0;return 0;}char fz_s1[100001],fz_s2[100001];for(int i=0;i<strlen(s1);i++){if(s1[i]=='-'||s1[i]=='+') continue;fz_s1[n++]=s1[i];}fz_s1[n]='\0';for(int i=0;i<strlen(s2);i++){if(s2[i]=='-'||s2[i]=='+') continue;fz_s2[m++]=s2[i];}fz_s2[m]='\0';if(strlen(fz_s1)<strlen(fz_s2)){swap(s1,s2);}else if(strlen(fz_s1)==strlen(fz_s2)) {if(strcmp(fz_s1,fz_s2)<0) swap(s1,s2);}if(s1[0]=='+'||s1[0]=='-') fz1=1;if(s2[0]=='+'||s2[0]=='-') fz2=1;n=0,m=0;for(int i=0;i<strlen(s1);i++){if(s1[i]=='+'||s1[i]=='-') continue;if(fz1) a[n++]=s1[strlen(s1)-i]-'0';else a[n++]=s1[strlen(s1)-i-1]-'0';} for(int i=0;i<strlen(s2);i++){if(s2[i]=='+'||s2[i]=='-') continue;if(fz2)b[m++]=s2[strlen(s2)-i]-'0';else b[m++]=s2[strlen(s2)-i-1]-'0';}if((s1[0]=='-'&&s2[0]=='-')){int c[100001]={0};int fz=0;for(int i=0;i<max(n,m);i++){fz=a[i]+b[i]+fz;c[i]=fz%10;fz/=10;}if(fz!=0) c[max(n,m)]=fz;int j=max(n,m)+10;while(c[j--]==0);j++;cout<<'-';for(;j>=0;j--){cout<<c[j];}}else if(s1[0]!='-'&&s2[0]!='-'){int c[100001]={0};int fz=0;for(int i=0;i<max(n,m);i++){fz=a[i]+b[i]+fz;c[i]=fz%10;fz/=10;}if(fz!=0) c[max(n,m)]=fz;int j=max(n,m)+10;while(c[j--]==0);j++;for(;j>=0;j--){cout<<c[j];}}else if(s1[0]!='-'&&s2[0]=='-'){int i;for( i=0;i<max(n,m);i++){if(a[i]-b[i]>=0) a[i]=a[i]-b[i];else a[i]=a[i]+10-b[i],a[i+1]--;}int j=max(n,m)+1;int flag=1;while(j){if(a[j]==0){j--;continue;}else break;}for(;j>=0;j--) cout<<a[j]; }else if(s1[0]=='-'&&s2[0]!='-'){int i;cout<<'-';for( i=0;i<max(n,m);i++){if(a[i]-b[i]>=0) a[i]=a[i]-b[i];else a[i]=a[i]+10-b[i],a[i+1]--;}int j=max(n,m)+1;int flag=1;while(j){if(a[j]==0){j--;continue;}else break;}for(;j>=0;j--) cout<<a[j]; }return 0;}

原创粉丝点击