P1601 A+B Problem(高精)
前言
这一题我一看题目就有想法了,但是具体实现比我想象中的困难些,我感觉应该有比我更加简洁的代码。至少C++是这样。
题目
题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入。a,b≤10500。
输出格式
输出只有一行,代表a+b的值。
输入输出样例
输入 #1
1
1
输出 #1
2
输入 #2
1001
9099
输出 #2
10100
题目分析
其实意思挺简单的,C++的int和long long int长度肯定是不能支持10500的,所以要想到使用别的方法,我想到了用字符串处理。
字符串处理就是把数值位一位一位像列竖式一样的计算,相当于你要注意每一位的满十进位。
由于两个数字位数可能不一样,所以这边后面还需要再写一个判断。具体实现代码见后面。
注意事项
1.字符表示参考ASCII,字符转化为数字时,需要减去‘0’,也就是48。
2.使用%10来进行十进制的进位。
3.string.length()用来得到string类型的长度
4.数组从0开始,数值存储在0到length-1之间
代码
#include <iostream>
#include <cstring>
using namespace std;
int main(){
string a,b;
int c[507]={0};
int count=0;
cin>>a;
cin>>b;
int alen=a.length()-1;
int blen=b.length()-1;
//cout<<alen<<" "<<blen<<endl;
while(alen>=0&&blen>=0)
{
if(c[count]+a[alen]+b[blen]-'0'-'0'>=10)
c[count+1]++;
c[count++]+=a[alen--]+b[blen--]-'0'-'0';
c[count-1]%=10;
}
if(alen>-1)//说明a还有未处理完的
{
while(alen>-1){
if(c[count]+a[alen]-'0'>=10)
c[count+1]++;
c[count++]+=(a[alen--]-'0')%10;
c[count-1]%=10;
}
}
else if(blen>-1)//说明b还有未处理完的
{
while(blen>-1){
if(c[count]+b[blen]-'0'>=10)
c[count+1]++;
c[count++]+=(b[blen--]-'0')%10;
c[count-1]%=10;
}
}
if(c[count]>0)
cout<<c[count];
for(int i=count-1;i>=0;i--)
cout<<c[i];
return 0;
}
后话
python解法
当你用C++写了n行代码后,你发现你不止会C和C++和Java。还有一种能力强大的语言Python。于是问题忽然变得简单起来。
python代码如下(AC)
a=input()
b=input()
a=int(a)
b=int(b)
print(a+b)
当然这显然不是这题的初心,但是它确实可以。但是python也可以模拟C++的做法解决这题。
另外给一个测试点
输入
11111111111111111111111111
9999999999999999999999999999999999
输出
10000000011111111111111111111111110