原题地址: [ http://acm.hdu.edu.cn/showproblem.php?pid=1002 ]
代码地址: [ http://download.csdn.net/detail/angryn00b/5054960 ]
Problem Description
给出2个数 分别为A ,B 并计算A + B的和
Input
首先输入测试次数
然后输入参与计算的2个数 A 和 B
注意这2个数会很大 这意味着32位整形将无法正确表示它们
你必须要自己控制它们的长度 不能长度超过1000
Output
每次测试你必须输出对应的2行
第一行应当输出“Case #:”, ‘#’符号为第几次的输入
第二行应当输出“A + B = Sum” Sum为A+B的和,请留意表达式中的空格
最后要保证每2个测试之间要有一个空行
Sample Input
2
1 2
112233445566778899 998877665544332211
Sample Output
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
代码:
/*
* Description: A+B problem
* Author : Angryn00b
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//输入字符串 把字符串转换成数字 存放入数组中
///
bool input (istream & is, string &_src, vector<int> &_dest);
//重载 << 用于输出 数组中的数
///
ostream & operator<<(ostream &os, const vector<int> &_dest);
// 计算A+B的和 并且去除存在0的首项
vector<int> sum(const vector<int> &_src1, const vector<int> &_src2);
int main(void)
{
//lines 为 输入的行数
//n 用于迭代
int lines, n = 0;
cin >> lines;
while (n < lines)
{
vector<int> A; // 存放A的大数
string a;
if (!input(cin, a, A)) // 字符串转换成数字存入数组
break;
vector<int> B; // 存放B的大数
string b;
if (!input(cin, b, B)) // 字符串转换成数字存入数组
break;
cout << "Case " << n+1 << ":" << endl;
cout << A << " + " << B << " = " << sum(A,B) << endl;
if (n != lines-1) // 处理空行
cout << endl;
++n;
}
return 0;
}
bool input (istream & is, string &_src, vector<int> &_dest)
{
if (is >> _src, is) {
for (string::const_iterator
ix = _src.begin(); ix != _src.end(); ++ix)
_dest.push_back(*ix-'0');
return true;
}
else
return false;
}
ostream & operator<< (ostream &os, const vector<int> &_dest)
{
for (vector<int>::const_iterator
ix = _dest.begin(); ix != _dest.end(); ++ix)
cout << *ix;
return os;
}
vector<int> sum(const vector<int> &_src1, const vector<int> &_src2)
{
int size = _src1.size() > _src2.size() ? _src1.size() : _src2.size();
vector<int> _sum(size+1, 0); //由于存在 99+1 = 100 所以要预留一个长度
int _is1 = _src1.size()-1;
int _is2 = _src2.size()-1;
for (int ix = size; ix >= 0; ix--)
{
if (_is1 >= 0) {
_sum[ix] += _src1[_is1];
--_is1;
}
if (_is2 >= 0) {
_sum[ix] += _src2[_is2];
--_is2;
}
if (_sum[ix] >= 10)
{
_sum[ix-1] = _sum[ix]/10;
_sum[ix] = _sum[ix]%10;
}
}
// 当长度没有增加时 去除预留的长度
if (_sum[0] == 0)
_sum.erase(_sum.begin());
return _sum;
}
AC:
1. 字符形式读入数据 并且使用数组来存放数据 然后相加
这里我采用的是string(负责读入字符) vector<int>(把字符转换成数字存储) 来实现
个位存放在数组的末尾项 以此类推 高位存放在首项
2. 99 + 1 = 100 会变成3位数 所以需要多预留一个空间来存放 可能产生的进位
3. 注意题目中的空行是出现在每2个测试的结果之间 意味着最后一次测试就不会输出空行