1005 大数加法

来源:互联网 发布:安卓锁屏拍照软件 编辑:程序博客网 时间:2024/06/06 16:34
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   
代码写的好长:需要注意得是A或B为负数的情况。其中为负数的情况,要比较2者绝对值的大小,让绝对值大的减小的,如果负数的长度-1(符号占一位,要减1)大于正数的,肯定负数的绝对值大。第二是:当长度相等的时候,比较2者绝对者大小。基本上就是这个想法,重复运算挺多的,考虑细节,WA了好多次.55555555555555555
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;char a[10050],b[10050];int numa[10050],numb[10050];int i,j;int  add(int lena,int lenb){for(i=lena-1,j=1;i>=0;i--)numa[j++]=a[i]-'0';for(i=lenb-1,j=1;i>=0;i--)numb[j++]=b[i]-'0';for(i=1;i<=10050;i++){numa[i]+=numb[i];if(numa[i]>=10){numa[i]-=10;numa[i+1]++;}}for(i=10050;i>=1&&numa[i]==0;i--);if(i==0){cout<<0<<endl;return 0;}for(;i>=1;i--)cout<<numa[i];}int reducea(int lena,int lenb){int flag=0;for(i=lena-1,j=1;i>=1;i--)numa[j++]=a[i]-'0';for(i=lenb-1,j=1;i>=0;i--)numb[j++]=b[i]-'0';if(lena-1>lenb)flag=1;if(lena-1==lenb){for(i=lenb;i>=1;i--){if(numa[i]==numb[i])continue;if(numa[i]<numb[i]){flag=0;break;}else{flag=1;break;}}}for(i=1;i<=10050;i++){if(flag==0){numb[i]-=numa[i];if(numb[i]<0){numb[i]=numb[i]+10;numb[i+1]--;}}if(flag==1){numa[i]-=numb[i];if(numa[i]<0){numa[i]=numa[i]+10;numa[i+1]--;}}}if(flag==1){for(i=10050;i>=1&&numa[i]==0;i--);if(i==0){cout<<0<<endl;return 0;}cout<<"-";for(;i>=1;i--)cout<<numa[i];}else{for(i=10050;i>=1&&numb[i]==0;i--);if(i==0){cout<<0;return 0;}for(;i>=1;i--)cout<<numb[i];}}int reduceb(int lena,int lenb){int flag=0;for(i=lena-1,j=1;i>=0;i--)numa[j++]=a[i]-'0';for(i=lenb-1,j=1;i>=1;i--)numb[j++]=b[i]-'0';if(lenb-1>lena)flag=1;if(lenb-1==lena){for(i=lena;i>=1;i--){if(numa[i]==numb[i])continue;if(numb[i]<numa[i]){flag=0;break;}else{flag=1;break;}}}for(i=1;i<=10050;i++){if(flag==0){numa[i]-=numb[i];if(numa[i]<0){numa[i]=numa[i]+10;numa[i+1]--;}}if(flag==1){numb[i]-=numa[i];if(numb[i]<0){numb[i]=numb[i]+10;numb[i+1]--;}}}if(flag==1){for(i=10050;i>=1&&numb[i]==0;i--);if(i==0){cout<<0;return 0;}cout<<"-";for(;i>=1;i--)cout<<numb[i];}else{for(i=10050;i>=1&&numa[i]==0;i--);if(i==0){cout<<0;return 0;}for(;i>=1;i--)cout<<numa[i];}}void reduce(int lena,int lenb){for(i=lena-1,j=1;i>=1;i--)numa[j++]=a[i]-'0';for(i=lenb-1,j=1;i>=1;i--)numb[j++]=b[i]-'0';for(i=1;i<=10050;i++){numa[i]+=numb[i];if(numa[i]>=10){numa[i]-=10;numa[i+1]++;}}for(i=10050;i>=1&&numa[i]==0;i--);cout<<"-";for(;i>=1;i--)cout<<numa[i];}int main(){int i,j;cin>>a>>b;int lena=strlen(a);int lenb=strlen(b);if(a[0]!='-'&&b[0]!='-')add(lena,lenb);else if(a[0]!='-'&&b[0]=='-'){reduceb(lena,lenb);}else if(a[0]=='-'&&b[0]!='-'){reducea(lena,lenb);}else{reduce(lena,lenb);}return 0;}

原创粉丝点击