HDOJ--1002(大数加法)

题目:

A+B问题(大数)

 

题解:

遇到类似这种大数问题时,由于C++提供的基本类型能表示的数的范围不足,所以需要使用字符串来代替大数,在进行大数的运算操作时需要特别注意进位的处理。

1. 数字与字符的相互转换:

      数字 ---> 字符: c = char(d + '0')

      字符 ---> 数字: d = c - '0'

2. 由于要考虑进位问题,计算需要从两个字符串的末尾开始,每计算出一位的值就将其放入一个vector(也可直接使用一个字符串然后使用+运算符连接字符)

具体思路看代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
	int n_case;
	cin >> n_case;

	vector<char> save;	// 用于保存结果字符
	string a, b, ta, tb, res;	
	bool carry;		// 是否进位
	int sum;

	for (int i = 0; i < n_case; ++i) {
		// 初始化
		carry = false;
		sum = 0;

		cin >> ta >> tb;
		
		// 清理
		save.clear();
		res.clear();

		// 将length更长的字符串对象赋给a,小的赋给b
		if (ta.size() < tb.size()) {
			a = tb;
			b = ta;
		}
		else {
			a = ta;
			b = tb;
		}
		
		int size_a = a.size(), size_b = b.size();
		int tsz_a = size_a, tsz_b = size_b;

		// 从两个字符串的末尾开始相加,直到某个字符串遍历完成
		while ((tsz_b--) && (tsz_a--)) {
			sum = a[tsz_a] - '0' + b[tsz_b] - '0';
			// 进位+1
			if (carry)	++sum;

			// 判断是否进位
			if (sum > 9)	
				carry = true;
			else
				carry = false;
			// 当前位的值转换为字符放入save
			save.push_back((char)(sum % 10 + '0'));
		}

		// 在上一个while循环结束后,更长的字符串还有剩余,将其处理掉
		for (int j = size_a - size_b - 1; j >= 0; --j) {
			sum = a[j] - '0';
			if (carry)
				++sum;
			if (sum > 9)
				carry = true;
			else
				carry = false;
			save.push_back(char(sum % 10 + '0'));
		}

		// 若存在进位,在最后添一个1
		if (carry)
			save.push_back('1');

		// 逆序将save中的字符连接,得到结果
		for (int j = save.size() - 1; j >= 0; --j) {
			res += save[j];
		}

		printf("Case %d:\n", i+1);
		cout << ta << " + " << tb << " = " << res << endl;
		// 判断,若本次循环不是最后一个case,则空出一行(题目要求)
		if (i < n_case - 1)
			printf("\n");
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值