C++ 大数字相加 —— 按位相加

这篇博客介绍了如何处理两个长度不超过1000的整数相加的问题,由于超过了long long类型的范围,因此采用原始的加法运算方式。从末位向前依次相加,遇到进位则向前一位进位。博客提供了详细的C++代码实现,包括数据输入、按位相加、进位处理和结果输出。整个过程遵循从低位到高位的计算逻辑,确保正确计算超长整数的和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

这是一道来自hdu OJ的题目

2NjJgO.png

思考

题目中指出,两个整数的长度小于等于1000。显然超出了long long类型的范围。

让我们回到最原始的加法运算

2NjgKg.png
通过上面这个案例我们可以总结出如下规则

  • 从末位向前依次相加
  • 相加结果大于十进位

现有数a与b,a有m位数,b有n位数

2U1TWq.png

  1. 求a与b的和,首先对a与b的后n位数进行按位相加
  2. 对第零位到第m-n位进行进位

实践

数据输入

string a, b;
cin >> a >> b;

int lena = a.size();
int lenb = b.size();
int lenmax = lena > lenb ? lena : lenb;
int lenmin = lena < lenb ? lena : lenb;
int flag = 0;	//进位标志
sstream str;	//结果

定义转成int型数据的宏

#define ctoi(x) (x-'0')

从最后一位到倒数第n位按位相加

for (int i = -1; i >= (0 - lenmin); i--) {
	int sum = ctoi(a[lena + i]) + ctoi(b[lenb + i]) + flag;

	if (sum >= 10)
	{
		sstr << sum - 10;
		flag = 1;
	}
	else
	{
		sstr << sum;
		flag = 0;
	}
}

从倒数第n+1位到倒数第m位进行进位

for (int i = 0 - lenmin - 1; i >= (0 - lenmax); i--)
{
	int sum = ctoi((lena > lenb ? a : b)[lenmax + i]) + flag;
	if (sum >= 10)
	{
		sstr << sum - 10;
		flag = 1;
	}
	else
	{
		sstr << sum;
		flag = 0;
	}
}

m位数与n位数相加可能会得到m+1位数

if (flag == 1)
{
	sstr << flag;
}

输出结果

string res = sstr.str();
reverse(res.begin(), res.end());

cout << a << " + " << b << " = ";
cout << res << endl;

源码

源码尽在Github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正崽不emo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值