数値誤差
を解いていての学び.
参考
数値誤差
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0); double a= 2.51; cout << (int) (a*100) << endl; return 0; }
250
のように整数型にキャストした際に誤差が発生する可能性がある.上記の問題では入力 B を100倍して整数に変換し,整数同士の掛け算・割り算で解くことで AC できる.その100倍の方法は以下の2通り.
- 微小な値を加えて誤差回避
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0); double b = 2.51; cout << (int) (b*100 + 0.0005) << endl; return 0; }
- String 型で入力を受け取って変換
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0); string s = "2.51"; int b = (s[0] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0'); cout << b << endl; return 0; }
最終的な AC コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0); ll a; string b; cin >> a >> b; ll ib = (b[0] - '0') * 100 + (b[2] - '0') * 10 + (b[3] - '0'); ll ab = a*ib / 100; cout << ab << endl; return 0; }