2010-11-22 8 views
1

私は今日プロジェクトのユーラー問題17を試してみることにしました。私はすぐにそれを解決するためにかなり高速のコードをC++で書いていました。しかし、何らかの理由で結果が間違っています。 質問があります:プロジェクトオイラー問題17 - 何が悪いですか?

1から5までの数字を1,2,3,4,5で書いた場合、合計で3 + 3 + 5 + 4 + 4 = 19文字が使用されます。

1から1000(1000)までのすべての数字が単語で書き出された場合、いくつの文字が使用されますか?

注:スペースやハイフンは数えないでください。例えば、342(三百四十二)は23文字、115(一五五)は20文字を含んでいます。数字を書き込むときに「と」を使用することは、英国の使用法に準拠しています。

私は真剣に私のプログラムのすべての部分を徹底的にチェックしたので、間違ったことは見つけられません。私が見つけられない唯一の事は、1000をチェックすると、whileループが正しくチェックされないことです。私は、< 1001の代わりに< 1000に私のwhileループの限界を下げることによってそれを修正し、11(onethousand = 11)を手作業で合計に加えました。しかし、それは動作しません。あなたが何が間違っているか教えていただけたら本当に感謝しています。私のコードはかなり悪いと思いますが、数分で完了します。だからここにそれがあります:

int getDigit (int x, int y) 
{ 
return (x/(int)pow(10.0, y)) % 10; 
} 

int main() 
{ 
string dictionary[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 
string dictionary2[18] = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; 
string dictionary3[10] = { "onehundred", "twohundred", "threehundred", "fourhundred", "fivehundred", "sixhundred", "sevenhundred", "eighthundred", "ninehundred", "onethousand" }; 

int i = 1; 
int last; 
int first; 
int middle; 

_int64 sumofletters = 0; 

while (i < 10)  //OK 
{ 
    sumofletters += dictionary[i].length(); 

    i++; 
} 

cout << sumofletters << endl; 

while (i < 20)  //OK 
{ 
    last = i % 10; 

    sumofletters += dictionary2[last].length(); 

    i++; 
} 

while (i < 100)  //OK 
{ 
    first = (i/10) + 8; 
    last = i % 10; 

    if (last != 0) 
    { 
    sumofletters += dictionary2[first].length() + dictionary[last].length(); 
    } 

    else 
    sumofletters += dictionary2[first].length(); 

    i++; 
} 

cout << sumofletters << endl; 

while (i < 1000)  //OK 
{ 
    last = i % 10; 
    first = (i/100) - 1; 
    middle = (getDigit(i, 1)) + 8; 

    if (middle != 0 && last != 0) //OK 
    { 
    if (middle == 1) 
    sumofletters += dictionary3[first].length() + dictionary2[last].length() + 3; 
    else 
    sumofletters += dictionary3[first].length() + dictionary2[middle].length() + dictionary[last].length() + 3; 
    } 

    else if (last == 0 && middle != 0) //OK 
    { 
    if (middle == 1) 
    sumofletters += dictionary3[first].length() + 6; 
    else 
    sumofletters += dictionary3[first].length() + dictionary2[middle].length() + 3; 
    } 

    else if (middle == 0 && last != 0) //OK 
    sumofletters += dictionary3[first].length() + dictionary[last].length() + 3; 

    else 
    sumofletters += dictionary3[first].length(); 

    i++; 
} 

sumofletters += 11; 

cout << sumofletters << endl; 

return 0; 
} 
+1

Project Eulerの問題17に精通していない人には、それが何であるか説明するか、少なくともリンクを与えることができます。あなたは、プログラムが何をすべきか分からなければ、人々がどこに問題があるかを伝えることを期待できません。 – ereOn

+0

ああええ..それについて忘れてしまった。編集:P – Lockhead

+2

あなたのコンピューティングパズルをコンピューティング的な方法で解決することをお勧めします。簡単に確認できる形式で出力を得る - 各数字のテキスト記述を印刷し、文字数を計算してから特に珍しい場合を見て、見直しを行います。 –

答えて

1

問題は、この行と一緒に表示されます。

middle = (getDigit(i, 1)) + 8; 

あなたがこの数に8を追加 - あなたのdictionary2へのオフセットとして、おそらく行動する - が、if文以下に、あなたはそれが必要な場合がありますgetDigitが-8を返さない限り、それらは決して満足できません。

ここにオフセットを追加するのではなく、必要に応じて追加してください。同じことを同じ辞書に保存しないでください。

完全に異なる構造体であっても、数値の文字列を生成する関数を記述してから、その文字列の長さを数えればよいでしょう。これはまた、あなたが長さを取っている実際の文字列を見ることができるので、このような問題をデバッグすることをはるかに簡単にします。

+0

ありがとう!それは今働く。 :D – Lockhead

2

fourtyは間違っています。

あなたの比較を確認してくださいmiddle == 0/middle!= 0/middle = 0.真ん中を計算する場所を見てみましょう。それは間違っている。

これらの両方を修正することで、正しい答えが得られます。

+0

結果はまだ間違っています= [ – Lockhead

+0

+1。しかし、英語が流暢でない人にとっては不公平です! ;) – ereOn

+0

2つ目の修正が追加され、正しい答えが得られました。 – marcog

4

あなたのために仕事をするのではなく、

小さな機能に分割します。 次に、各機能を個別にテストすることができます。

単体テストを書くか、デバッガを使用してステップスルーし、少し紙に書いて、あなたとあなたのコードが異なるところを見てください。

+0

+1パーツを分割してテストすると、ほとんどの場合、この種のエラーが発生します。 – daramarak

関連する問題