题意:
大数加法.
思路:
先把所有数字右对齐, 左边不足的地方就补0, 然后按一般加法进行计算即可.
要点:
使用 sprintf 转 int 为 char[].
代码:
# include <iostream>
# include <string>
# include <cstdio>
# include <cstring>
# include <vector>
# include <algorithm>
# include <cctype>
# include <iterator>
using namespace std;
// sprintf 转 int 为 char[]
// 大整数相加, lines 里的每一行包含了一个整数
string sumBigInt(const vector<string>& lines, const int maxSize){
string result = "";
int carry = 0; // 进位
for(int i=maxSize-1; i>=0; i--){
int sum = carry;
for(int j=0; j<lines.size(); j++){
char c = lines[j][i];
sum += atoi(&c);
}
// 第一位时, 直接全部转成字符串
if( i == 0){
char a[10];
sprintf(a, "%d", sum);
result = a + result;
break;
}
// 当前需要存的是尾位
char a[2];
sprintf(a, "%d", sum % 10);
result = a + result;
// 计算进位
carry = sum / 10;
}
return result;
}
// 右对齐, 即把每一个 line 都设成最长的长度, 不够的地方, 就左补 0
void alignRight(vector<string>& lines, const int maxSize){
for(int i=0; i<lines.size(); i++){
if (lines[i].size() < maxSize) {
string longer(maxSize, '0');
copy(lines[i].begin(), lines[i].end(),
longer.begin() + (maxSize - lines[i].size()) );
lines[i] = longer;
}
}
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen ("424_i.txt", "r", stdin);
freopen ("424_o.txt", "w", stdout);
#endif
vector<string> lines;
int maxSize = 0;
string line;
getline(cin, line);
while ( (!cin.eof()) && line != "0" ) {
maxSize = line.size() > maxSize ? line.size() : maxSize;
lines.push_back(line);
getline(cin, line);
}
alignRight(lines, maxSize);
cout << sumBigInt(lines, maxSize) << endl; // 这里要多输出一个 endl 否则会 WA
return 0;
}
环境: C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE