给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586 468711654886
Output示例
537643802472
没有一发TLE,AC了,好开心~~
分析:思路还是很清晰的,就是代码写的有点长,可以改进,改进需要注意的点太多,遂放弃、、
分为两种情况,s1,s2同号或者异号,两种情况都要对s1,s2进行处理,进行移位操作,末位存在Max_n-1位置,(去掉负号后的)首位存在v,方便计算。s1,s2同号时很好计算啦,异号时,交换s1,s2,使得s1总为正的,再对s1,s2相对绝对值的大小进行讨论即可!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max_n=11000;
bool f1=0,f2=0;//f1,f2分别记录了s1,s2的正负
int len1,len2,v1=Max_n,v2=Max_n;//v1,v2记录了s1,s2首位的位置(去掉负号后的)
char s1[Max_n],s2[Max_n];
void Add(){
if(f1&&f2){//s1,s2全为负
for(int i=len1-1;i>=1;i--){//s1末位存在Max_n-1位置,首位存在v1(下同)
s1[--v1]=s1[i];
s1[i]='0';
}
for(int i=len2-1;i>=1;i--){//s2末位存在Max_n-1位置,首位存在v2(下同)
s2[--v2]=s2[i];
s2[i]='0';
}
int v=min(v1,v2);
for(int i=Max_n-1;i>=v;i--){
s1[i]=s2[i]+s1[i]-'0';
if(s1[i]>'9'){s1[i]-=10;s1[i-1]++;}
}
if(s1[v-1]=='1')v--;//进位处理
printf("-");
for(int i=v;i<Max_n;i++)
printf("%c",s1[i]);
printf("\n");
}
else {//s1,s2全为正
for(int i=len1-1;i>=0;i--){
s1[--v1]=s1[i];
s1[i]='0';
}
for(int i=len2-1;i>=0;i--){
s2[--v2]=s2[i];
s2[i]='0';
}
int v=min(v1,v2);
for(int i=Max_n-1;i>=v;i--){
s1[i]=s2[i]+s1[i]-'0';
if(s1[i]>'9'){s1[i]-=10;s1[i-1]++;}
}
if(s1[v-1]=='1')v--;//进位处理
for(int i=v;i<Max_n;i++)
printf("%c",s1[i]);
printf("\n");
}
}
void Sub(){
if(f1){swap(s1,s2);swap(len1,len2);} //令s1为正,方便处理
int f=1;//判断s1,s2的绝对值大小
if(len1>=len2)f=1;
else if(len1<len2-1)f=0;
else {
for(int i=0;i<len1;i++){
if(s1[i]>s2[i+1]){f=1;break;}
if(s1[i]<s2[i+1]){f=0;break;}
}
}
//cout<<f<<endl;
if(f==1){ //s1的绝对值大于s2
for(int i=len1-1;i>=0;i--){
s1[--v1]=s1[i];
s1[i]='0';
}
for(int i=len2-1;i>=1;i--){
s2[--v2]=s2[i];
s2[i]='0';
}
int v=min(v1,v2);
for(int i=Max_n-1;i>=v;i--){
s1[i]=s1[i]-s2[i]+'0';
if(s1[i]<'0'){s1[i]+=10;s1[i-1]--;}
}
while(s1[v]=='0')v++;//退位处理
for(int i=v;i<Max_n;i++)
printf("%c",s1[i]);
printf("\n");
}
else {//s1的绝对值小于s2
for(int i=len1-1;i>=0;i--){
s1[--v1]=s1[i];
s1[i]='0';
}
for(int i=len2-1;i>=1;i--){
s2[--v2]=s2[i];
s2[i]='0';
}
int v=min(v1,v2);
for(int i=Max_n-1;i>=v;i--){
s2[i]=s2[i]-s1[i]+'0';
if(s2[i]<'0'){s2[i]+=10;s2[i-1]--;}
}
while(s2[v]=='0')v++;//退位处理
printf("-");
for(int i=v;i<Max_n;i++)
printf("%c",s2[i]);
printf("\n");
}
}
int main()
{
for(int i=0;i<Max_n;i++)s1[i]=s2[i]='0';
scanf("%s%s",s1,s2);
len1=strlen(s1),len2=strlen(s2);
if(s1[0]=='-')f1=1;
if(s2[0]=='-')f2=1;
if((f1&&f2)||(!f1&&!f2))
Add(); //同为正负操作
else Sub(); //异号操作
return 0;
}