424 - Integer Inquiry

题意:
大数加法.

思路:
先把所有数字右对齐, 左边不足的地方就补0, 然后按一般加法进行计算即可.

要点:
使用 sprintf 转 int 为 char[].

题目:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=97&page=show_problem&problem=365

代码:

# 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

你可能感兴趣的:(Integer,uva,Inquiry,424)