递归——大整数加法

描述
计算a+b的值
关于输入
第一行输入测试数据的数目 n
接下来 n 行,每行输入两个非负整数a和b,它们的位数<=200
关于输出
输出数据有 n 行,每行输出一个非负整数,即对应数据 a+b 的值,不允许有前导的“0”
例子输入
1

11111111111111111111111111111111111

22222222222222222222222222222222222
例子输出
33333333333333333333333333333333333

提示
请用字符串输入数据,并模拟人工竖式计算
#include<iostream>
#include<cmath>
using namespace std;
string a, b;//用来存放两个数
char c[210];//存放结果
int la = 0, lb = 0;//两个数的长度
int flag = 0;//进位的数
void f()
{
	if (la == lb) {
		for (int i = la - 1; i >= 0; --i) {//从最后一位开始算
			int temp = a[i] + b[i] - 2*'0';
			if (flag != 0) {
				c[i+1] = temp % 10 + flag + '0';
			}
			else c[i+1] = temp % 10 + '0';
			if (temp > 9) {//进位
				flag = temp / 10;
			}
			else flag = 0;//如果不够10,进位应重置为0
		}
		c[0] = flag+'0';
	}
	else if (la > lb) {
		int temp;
		for (int i = la - 1; i >= la - lb; --i) {
			temp = a[i] + b[i - la + lb] - 2 * '0' + flag;
			c[i + 1] = temp % 10 + '0';
			if (temp > 9) {
				flag = temp / 10;
			}
			else flag = 0;
		}
		for (int i = la - lb - 1; i >= 0; --i) {
			temp = a[i] - '0' + flag;
			c[i + 1] = temp % 10 + '0';
			if (temp > 9) { flag = temp / 10; }
			else flag = 0;
		}
		c[0] = flag + '0';
	}
	else if (la < lb) {
		int temp;
		for (int i = lb - 1; i >= lb - la; --i) {
			temp = b[i] + a[i - lb + la] - 2 * '0' + flag;
			c[i + 1] = temp % 10 + '0';
			if (temp > 9) {
				flag = temp / 10;
			}
			else flag = 0;
		}
		for (int i = lb - la - 1; i >= 0; --i) {
			temp = b[i] - '0' + flag;
			c[i + 1] = temp % 10 + '0';
			if (temp > 9) { flag = temp / 10; }
			else flag = 0;
		}
		c[0] = flag + '0';
	}
}
int main()
{
	int n;
	cin >> n;
	while (n--) {
		cin >> a >> b;
		la = a.size(); 
		lb = b.size();
		f();
		int i;
		bool x = 0;
		for (i = 0; i <= max(la,lb); ++i) {
			if (c[i] == '0' && x == 0) {
				continue;
			}
			else if (c[i] != 0) {
				x = 1;
			}
			cout << c[i];
		}
		cout << endl;
		if (x == 0)cout << 0 << endl;
		flag = 0;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值