洛谷P1601 A+B Problem(高精)解析及AC代码

P1601 A+B Problem(高精)

  • 前言
  • 题目
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
      • 输入 #2
      • 输出 #2
    • 题目分析
    • 注意事项
  • 代码
  • 后话
    • python解法
    • 另外给一个测试点
      • 输入
      • 输出
  • 题目来源

前言

这一题我一看题目就有想法了,但是具体实现比我想象中的困难些,我感觉应该有比我更加简洁的代码。至少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之间

代码

洛谷P1601 A+B Problem(高精)解析及AC代码_第1张图片

#include 
#include 
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<
	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

题目来源

洛谷链接

你可能感兴趣的:(洛谷专练计划,#,【算法1-1】模拟与高精度,算法,python,其他,笔记,c++,c语言)