杭电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次总算正确了):