洛谷P1601 A+B Problem(高精)

题目描述

高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b]

输入输出格式

输入格式:

 

分两行输入a,b<=10^500

 

输出格式:

 

输出只有一行,代表A+B的值

 

输入输出样例

输入样例#1: 复制

1
1

输出样例#1: 复制

2

思路:显而易见是通过数组来模拟,之前写过类似的,直接用了,不过以前写的太差了。

#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int main()
{                                          //肯定不是最优的,而且还很冗长,是我太菜了
	string a, b;
	char c[1000];                       //这里要用到char,因为我vs过不了,嘤嘤嘤
	int t, i, j, lag , m, o = 1, n;     //lag是进位,m是c数组的下标,用n赋值为t,下面会解释
	//cin >> t;
	//n = t;
	//while (t--)
	//{
		cin >> a >> b;
		m = 0; lag = 0;             //下面会将两个字符串相加一直到其中一个结束,因为位数不一定相等
		for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
		{                                           //size函数是计算字符串长度的
			c[m] = a[i] + b[j] - 48 + lag;      //根据asc码来运算,lag为进位
			lag = 0;                            //赋值0,只有有进位时才为1
			if (c[m]>57)
			{
				c[m] -= 10;
				lag = 1;
			}
			m++;
		}
		if (a.size() == b.size())          //如果字符串长度相等,证明已经相加结束,只判断最高位是否有进位
		{
			if (lag)                   //如果有,那么最高位只会为1
				c[m++] = 49;
		}
		if (a.size()>b.size())             //如果第一个字符串长,那么继续拿进位和第一个字符串相加,
		{                                  //比如说123+9,3与9相加后,1,2要继续和进位相加
			if (lag)                   //两种情况,第一种,有进位
			{
				for (; i >= 0; i--)  //i不用赋初值,因为i即为上次相加的位置
				{
					c[m] = a[i] + lag;
					if (c[m] > 57)   //这里应该不难理解
					{
						c[m] -= 10;
						lag = 1;
					}
					else
						lag = 0;
					m++;
				}
				if (lag)                //这是最高位计算后,再判断最高位是否有进位
					c[m++] = 49;
			}
			else                          //第二种情况,没有进位,则保持原值不用再计算
			{
				for (; i >= 0; i--)
					c[m++] = a[i];
			}
		}
		if (a.size()<b.size())                //当第二个字符串位数较多时同上
		{
			if (lag)
			{
				for (; j >= 0; j--)
				{
					c[m] = b[j] + lag;
					if (c[m] > 57)
					{
						c[m] -= 10;
						lag = 1;
					}
					else
						lag = 0;
					m++;
				}
				if (lag)
					c[m++] = 49;
			}
			else
			{
				for (; j >= 0; j--)
					c[m++] = b[j];
			}
		}
		//cout << "Case " << o << ":" << endl;    //最后要说一下输出,要严格按照题目要求,注意数字间有空格
		//cout << a << " + " << b << " = ";
		for (i = m - 1; i >= 0; i--)
			cout << c[i];
		cout << endl;                          //每组数据最后都要换行,endl就是换行的意思,但每两组数据间要空上一行
		//if (o<n)                               //所以要用到n,假如有3组数据,o初值为1,所以只有为1,2时才空行,即1与2,2与3之间空行
			//cout << endl;
		//o++;
	//}
	return 0;                                      //光A题题解就写到12点了,睡觉喽
}

 

posted @ 2018-09-29 16:33  浮生惘语  阅读(138)  评论(0编辑  收藏  举报