大数加法

题目描述

求两个不超过200位的非负整数的和。

输入

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

22222222222222222222
33333333333333333333

样例输出


55555555555555555555


本来想用一个函数来相加,但发现不能正确传递,这个问题(数组名作函数参数)下次解决。

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
char a[205]; int la;
char b[205]; int lb;
char c[205]; int l;
//int jjj(char xx[], char yy[])//不知道怎么传递,伤心
//{
//	int i;
//	int x=0, y=0;
//	for (i = l - 1; i >= 0; i--)
//	{
//		int s;
//		s = xx[i] - '0' + yy[i] - '0' + x;
//		if (s >= 10)
//		{
//			x = s / 10; c[i] = s % 10 + '0';
//		}
//	}
//	return x;
//}
int main()
{

	cin >> a; cin >> b;
	la = strlen(a);
	lb = strlen(b);
	l = max(la, lb);
	int i;
	//以下这一步,我是为了让两个字符数组的个数相同,
	//短的字符数组,前面用0补齐
	//同时,为了统一,两个相加的字符数组分别变为数组c和数组a
	if (la >=lb)
	{
		for (i = 0; i <= la - lb - 1; i++) c[i] = '0';
		for (i = la - lb; i < la; i++)
			c[i] = b[i - (la - lb)];

	}
	else if (lb > la)
	{
		for (i = 0; i <= lb - la - 1; i++)   c[i] = '0';
		for (i = lb - la; i < lb; i++)  c[i] = a[i - (lb - la)];
		for (i = 0; i < lb; i++) a[i] = b[i];
	}
	int x = 0, y = 0;
	memset(b, 0, sizeof(0));//数组b用来存放最终答案
	for (i = l - 1; i >= 0; i--)//从个位开始加
	{
		int s;
		s = c[i] - '0' + a[i] - '0' + x; 
		x = 0;//这一步太重要,没有这一步过不了样例:0342+888888;
		//因为百位,8+3为11,x为1;x不清零的话,千位会变成9,但实际上应该是8
		if (s >= 10)
		{
			x = s / 10; //x为要进上去的数,比如个位13,3留下,1进上
			b[i] = s % 10 + '0';
		}
		else b[i] = s + '0';
	}
	if (x != 0)//最后1个x就是最高位的数
	{
		cout << x;
		for (i = 0; i < l; i++) cout << b[i];
	}
	else//注意前导0的情况
	{
		bool f = 1;
		for (i = 0; i < l ; i++)
		{
			if (f == 0) cout << b[i];//x为0,即最高为0,只后还是0的话就不要输出了
			//f==0代表之前有一位不是0,那么后面几位都可以放心输出,比如100010
			if (f == 1 && b[i] != '0') 
			{ f = 0; cout << b[i]; }

		}
	}
	cout << endl;
	return 0;
}


原文地址:https://www.cnblogs.com/caiyishuai/p/13271320.html