Official

B - 小数点第 D 位/Dth decimal place Editorial by Nyaan


この問題は小数の足し算をする問題ですが、double 型などの浮動小数点数型を利用すると誤差が発生してしまうので注意が必要です。
\(A\) の整数部を \(A_i\), 小数部を \(D\) 桁の整数とみなしたものを \(A_d\) とします。\(B\) についても同様に \(B_i, B_d\) を定めます。 すると答えは \(A_i, A_d, B_i, B_d\) を用いて

\[A_i + B_i + 10^{-D} \times (A_d + B_d)\]

と表せます。
また、\(A_i + B_i\)\(A_d + B_d\) はどちらも整数同士の足し算なので、筆算の要領で下の桁から順に計算していくことができます。(\(A_d + B_d\)\(10^D\) 以上になるケースに注意してください。)
C++ による実装例は次の通りです。

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

int main() {
  int D;
  string A, B;
  cin >> D >> A >> B;
  string AI, AD, BI, BD;
  AI = A.substr(0, A.size() - D - 1);
  AD = A.substr(A.size() - D, D);
  BI = B.substr(0, B.size() - D - 1);
  BD = B.substr(B.size() - D, D);
  int carry = 0;
  string CD(D, ' ');
  for (int i = D - 1; i >= 0; i--) {
    int s = AD[i] - '0' + BD[i] - '0' + carry;
    CD[i] = '0' + s % 10;
    carry = s / 10;
  }
  string CI = to_string(stoi(AI) + stoi(BI) + carry);
  cout << CI << "." << CD << endl;
}

posted:
last update: