2016-05-28 5 views
-3

https://projecteuler.net/problem=13プロジェクトオイラー#13 C++

は、次の一から百まで50桁の数字の和の最初の10桁の数字をワークアウト。

私はXcodeでC++を使って解決しようとしています。私は数字をファイルに保存してそれを正常に構築しましたが、間違った答えがありました。ここに私のコードは次のとおりです。和の 5.59087976462e + 51

だから、最初の10桁:

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

int main(void) { 
    double sum = 1; 
    double num; 
    ifstream fin("/Users/pwd/programs/projectEuler13/num.txt"); 

    while (fin) { 
    fin >> num; 
    sum += num; 
    } 
    fin.close(); 
    cout.precision(12); 
    cout << sum << endl; 
    return 0; 
} 

私は結果だ5590879764. をしかし、それは間違っています。私のコードで何が間違っていますか?私が見ることができる

+0

ダブル?そして、あなたは* 10桁に減らす必要があります。 – deviantfan

+0

どういう部分が間違っていますか?たぶん私はその質問を理解していないかもしれません。合計の最初の10桁を尋ねます。合計として5.59087976462e + 51を得ました。それの最初の10桁は何ですか? –

+0

@CodyGrayそれは科学的表記ではありませんか? –

答えて

2

いくつかの問題:

  1. これはあなたの結果を変更することが非常に低いですが、1から合計を開始。

  2. 浮動小数点の使用には不正確さがあります。あなたの結果を変更する可能性は高くなりますが、この場合はおそらく10桁の有効数字が必要なため、おそらくまだ有効にならないでしょう。

  3. 最も重大な問題:誤って入力をループしています。 Why is iostream::eof inside a loop condition considered wrong?を参照してください。おそらく最後の番号を2度追加することになります。入力ストリームをループする際の正しい方法は次のとおりです。

    while (fin >> val) { 
        //do something with val. 
    } 
    
+0

うん、そうですが、浮動小数点を避けるにはどうすればいいですか? –

+0

GMPのようなビッグナンバーのライブラリを使うこともできますし、それぞれの数字を数字の配列として表すことで長時間の追加を実装することもできます。しかし、この場合、浮動小数点はおそらく十分です。 – interjay

+0

#3で修正されているように、問題を解決するのに十分な有効数字に正解を返します。 –