杭电1002——大数相加

杭电1002——A + B Problem II

一、问题描述



二、解题思路


初看这个题目时,以为只是简单的加法,便很快就写完了,但是然而可是,,,提交上去居然错了!!!

我便在网上找了有关这题的代码;发现这并不是一道简单的加法题,是一道大数加法,因为题目要求是1000位以内,而这早已超出了整型的长度范围,显然用整型是不可取的,所以得用数组。再看了网上的代码后,我也自己敲了这题,最后提交了数次总算对了。

基本思路其实跟小学竖式相加类似,逢十进一。于是我用temp来存每次的进位,并参与到下一次的运算当中。还有就是两个数的长度问题:我先是将前面长度相等的部分进行加法,多出来的那一段再进行加法。最后要注意的就是格式问题啦


三、代码部分


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

int main()
{
	int n;//总共n组数据
	string str1,str2;//每组数据中输入的两个数(以字符串的形式输入,之后转成int类型) 
	int sum[1001];//用来存放计算结果 
	int d;//计算结果的长度 
	int temp;//用来存取进位,并参与下一次的运算!!! 
	int lenth1,lenth2;//两个字符串的长度 - 1,即字符串的最大数组下标 
	cin >> n;
	for(int i = 1 ;i <= n; i++)
	{
		d = 0;
		temp = 0;
		cin >> str1 >> str2;
		lenth1 = str1.size() - 1;
		lenth2 = str2.size() - 1;
		//将两个数含有的相同 位数进行相加 
		while(lenth1 >= 0 && lenth2 >= 0)
		{
			int m1 = str1[lenth1] - '0';//转为int 
			int m2 = str2[lenth2] - '0';
			sum[d++] = (temp + m1 + m2) % 10;
			temp = (temp + m1 + m2) / 10;
			lenth1--;
			lenth2--;
		}
		//将其中一个数多出来的位数进行加法 
		if(lenth1 > lenth2)
		{
			while(lenth1 >= 0)
			{
				int m = str1[lenth1] - '0';
				sum[d++] = (temp + m) % 10;
				temp = (temp + m) / 10;
				lenth1--;
			}
		}
		else
		{
			while(lenth2 >= 0)
			{
				int m = str2[lenth2] - '0';
				sum[d++] = (temp + m) % 10;
				temp = (temp + m) / 10;
				lenth2--;
			}
		}
		cout << "Case " << i << ":" << endl; 
		cout << str1 << " + " << str2 << " = " ;
		//若最后还有进位 
		if(temp != 0)
		{
			cout << temp;
		}
		for(int j = d - 1; j >= 0; j--)
		{
			cout << sum[j];
		}
		if(i < n)
		{
			cout << endl << endl;
		}
		else
		{
			cout << endl;
		}
	}
}


四、bug与调试


前面几次提交都是WA,经过几次调试发现存在的问题都有以下这些:最前面的进位漏了;数组下标异常;最后d没减一

后来格式错了好几次:主要是换行和空格的问题

以下是提交列表(提交了n次总算正确了):


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值