私は今日プロジェクトのユーラー問題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;
}
Project Eulerの問題17に精通していない人には、それが何であるか説明するか、少なくともリンクを与えることができます。あなたは、プログラムが何をすべきか分からなければ、人々がどこに問題があるかを伝えることを期待できません。 – ereOn
ああええ..それについて忘れてしまった。編集:P – Lockhead
あなたのコンピューティングパズルをコンピューティング的な方法で解決することをお勧めします。簡単に確認できる形式で出力を得る - 各数字のテキスト記述を印刷し、文字数を計算してから特に珍しい場合を見て、見直しを行います。 –