SDNUoj-1303 高精度加法(正整数)
题面
Description
求A+B
Input
多组测试样例。两个正整数X,Y(0≤X,Y≤10^100)
Output
输出结果
Sample Input
1 1
12345 54321
Sample Output
2
6666
做题步骤分析
**计算两个大数相加,显然int和long long是满足不了要求的。那么我们就要首先找到储存这个大数的方法,既然整个数字没法输入进去,那我们可以分别储存每位数字到数组之中。我们选择使用字符串记录数字,然后再一位一位录入数组。代码如下:
int a[1005],b[1005];
void chucun(char s[],char t[])
{
a[0]=strlen(s);
b[0]=strlen(t);
for(int i=a[0],j=0;i>0;i--,j++)
{
a[i]=s[j]-'0';
}
for(int i=b[0],j=0;i>0;i--,j++)
{
b[i]=t[j]-'0';
}
return ;
}
接下来就该考虑把两个数字加起来的方法了。在加法中我们首先需要想到进位问题,这里我们使用flag变量来储存进位,如下:
void xiangjia(int a[],int b[])
{
int len=a[0]>b[0]?a[0]+1:b[0]+1;
int flag=0;
int temp=0;
for(int i=1;i<=len;i++)
{
temp=a[i]+b[i]+flag;
a[i]=temp%10;
flag=temp/10;
}
a[0]=len;
return ;
}
这两大难点想出来了后就可以写出一个基本的代码了:
#include <iostream>
#include <cstring>
using namespace std;
int a[1005],b[1005];
void chucun(char s[],char t[])
{
a[0]=strlen(s);
b[0]=strlen(t);
for(int i=a[0],j=0;i>0;i--,j++)
{
a[i]=s[j]-'0';
}
for(int i=b[0],j=0;i>0;i--,j++)
{
b[i]=t[j]-'0';
}
return ;
}
void xiangjia(int a[],int b[])
{
int len=a[0]>b[0]?a[0]+1:b[0]+1;
int flag=0;
int temp=0;
for(int i=1;i<=len;i++)
{
temp=a[i]+b[i]+flag;
a[i]=temp%10;
flag=temp/10;
}
a[0]=len;
return ;
}
int main()
{
char s[1000],t[1000];
cin>>s>>t;
chucun(s,t);
xiangjia(a,b);
int len=a[0];
while(len>0)cout<<a[len--];
return 0;
}
然而这个代码仍然存在问题,比如当我们输入1和10000时,它的输出会变成010001,因此我们需要写一个函数来去除无用零:
void quling()
{
int len=a[0];
while(a[len]==0)len--;
while(len>0)cout<<a[len--];
cout<<endl;
return ;
}
再添加多组输入循环,以上代码的最终形式为:
#include <iostream>
#include <cstring>
using namespace std;
int a[1005],b[1005];
void qingkong()
{
for(int i=0;i<1000;i++)
{
a[i]=0;
b[i]=0; }
return ;
}
void chucun(char s[],char t[])
{
a[0]=strlen(s);
b[0]=strlen(t);
for(int i=a[0],j=0;i>0;i--,j++)
{
a[i]=s[j]-'0';
}
for(int i=b[0],j=0;i>0;i--,j++)
{
b[i]=t[j]-'0';
}
return ;
}
void xiangjia(int a[],int b[])
{
int len=a[0]>b[0]?a[0]+1:b[0]+1;
int flag=0;
int temp=0;
for(int i=1;i<=len;i++)
{
temp=a[i]+b[i]+flag;
a[i]=temp%10;
flag=temp/10;
}
a[0]=len;
return ;
}
void quling()
{
int len=a[0];
while(a[len]==0)len--;
while(len>0)cout<<a[len--];
cout<<endl;
return ;
}
int main()
{
char s[1000],t[1000];
while(cin>>s>>t){
chucun(s,t);
xiangjia(a,b);
quling();
qingkong();
}
return 0;
}