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

文章介绍了如何使用C++进行高精度加法的字符串处理实现,通过逐位运算处理大整数,并提供了Python版本的简洁解法。讨论了字符转数字、进位处理和代码实现细节。
摘要由CSDN通过智能技术生成

前言

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

题目来源

洛谷链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值