#C++ 1e18と1000000000000000000は違うのか
AtCoderでABC_B 169を解いています。
入力値を掛け合わせて10の19乗を超えていれば-1を出力し
超えていなければ掛け合わせた数字を出力します。
##私の実装
C++
1#include <bits/stdc++.h> 2using namespace std; 3using ll = long long; 4 5int main() { 6 int N; 7 cin >> N; 8 vector<ll> A(N); 9 10 ll ans = 1; 11 12 for(int i=0;i<N; i++) { 13 cin >> A[i]; 14 if(A[i] == 0) { 15 cout << 0 << endl; 16 return 0; 17 } 18 } 19 20 for(int i=0; i<N; i++) { 21 //掛けた桁数が18桁を超える場合は-1を出力、最終的な値に達する前のオーバーフローを確認 22 if(log10(ans) + log10(A[i]) > 18) { 23 cout << -1 << endl; 24 return 0; 25 } 26 ans *= A[i]; 27 28 //-----------質問の部分--------------- 29 //(ansが10の18乗を超えていたら-1を出力としたい。) 30 if(ans > 1e18) { 31 cout << -1 << endl; 32 return 0; 33 } 34 } 35 cout << ans << endl; 36}
ansが10の18乗を超えていた場合の表現を
cpp
1if(ans > 1e18) { 2 cout << -1 << endl; 3 return 0; 4}
としていますが、ansの値が10の18乗+1(1000000000000000001)のときでもこの制限にはかからず
cpp
1cout << ans << endl;
こちらでansの値10の18乗+1が出力されてしまいます。
##調べたこと
1e18で1の18情が表せていると思っていたのですが、何が問題だったのでしょうか?
ご存知の方がいましたらアドバイスいただけると幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。