首頁  >  文章  >  ProjectEuler 問題 17:我更改了這一行程式碼,我的答案發生了巨大變化,儘管我認為它應該可以正常工作

ProjectEuler 問題 17:我更改了這一行程式碼,我的答案發生了巨大變化,儘管我認為它應該可以正常工作

WBOY
WBOY轉載
2024-02-13 20:51:08909瀏覽

php小編蘋果在ProjectEuler問題17中遇到了一個有趣的狀況。他更改了一行程式碼後,發現答案發生了巨大變化,儘管他以為程式碼應該可以正常運作。這個問題引發了他的好奇心,他開始探索其中的原因,並尋求解決方案。這個故事充滿了挑戰與思考,讓人期待小編的答案。

問題內容

我正在研究 project euler 問題 17。我應該寫一個程式來計算寫出的數字 1-1000 中的字元總數。您忽略空格和連字符。根據問題的說明,數百個數字包括一個「和」(三百四十二)。我的程式碼在大多數情況下都有效,除了 100 的倍數(當它計算額外的“和”時)。例如,將 600 數為“六百和”。這導致我的答案偏離了 27(每百個數字有 3 個,其中有 9 個)。這是幾乎正確的解決方案:

string[] nums = {"",
                 "one",
                 "two",
                 "three",
                 "four",
                 "five",
                 "six",
                 "seven",
                 "eight",
                 "nine",
                 "ten",
                 "eleven",
                 "twelve",
                 "thirteen",
                 "fourteen",
                 "fifteen",
                 "sixteen",
                 "seventeen",
                 "eighteen",
                  "nineteen"};
string[] ten = {"",
                "",
                "twenty",
                "thirty",
                "forty",
                "fifty",
                "sixty",
                "seventy",
                "eighty",
                "ninety"};
int sum = 0;
map<integer, integer> ones = new hashmap<>();
map<integer, integer> teens = new hashmap<>();
map<integer, integer> tens = new hashmap<>();
for (int i = 0; i < 10; i++) {
    ones.put(i, nums[i].length());
}
for (int i = 10; i < nums.length; i++) {
    teens.put(i, nums[i].length());
}
for (int i = 0; i < ten.length; i++) {
    tens.put(i * 10, ten[i].length());
}
for (int i = 1; i < 1000; i++) {
    int num = 0;
    int n = i % 100;
    if (n > 19 || n < 10) {
        num += ones.get(n % 10);
        num += tens.get(n - n % 10);
    }
    else {
        num += teens.get(n);
    }
    num += i > 99 ? "hundredand".length() : 0;
    num += ones.get(i / 100);
    system.out.println(num + " " + i);
    sum += num;
}
sum += ("onethousand").length();
// actual is 21124
system.out.println(sum);

這會導致輸出 21151,與預期輸出 21124 相差 27。變數 num 用於偵錯目的。

我嘗試更改循環的其中一行,並添加了額外的語句:

num += i>99 ? "hundred".length() : 0;
num += i%100==0 ? 3 : 0;

執行此更新版本後,輸出為 18487。我不確定為什麼這種差異如此驚人,並且想了解這是從哪裡來的。我首先認為這是因為三元運算符,因為我對它的了解有限。另外,歡迎提出任何使程式碼更有效率的建議。 我想在列印之前先輸入 sum-27,但我覺得這有點作弊:)。 謝謝!

解決方法

正如其他人在對您的問題的評論中所說,您的問題是您的程式碼如何處理 100 倍數的數字。您總是加上,而從不只加入嗯>。事實上,您在問題中表示自己:

在下面的程式碼中,我使用明確的 if 語句 - 而不是 三元運算子 – 因為我相信它使程式碼在閱讀時更容易理解。請注意,這是我對您的問題中發布的程式碼所做的唯一更改。

import java.util.hashmap;
import java.util.map;

public class myclass {
    public static void main(string args[]) {
        string[] nums = {"",
                         "one",
                         "two",
                         "three",
                         "four",
                         "five",
                         "six",
                         "seven",
                         "eight",
                         "nine",
                         "ten",
                         "eleven",
                         "twelve",
                         "thirteen",
                         "fourteen",
                         "fifteen",
                         "sixteen",
                         "seventeen",
                         "eighteen",
                         "nineteen"};
        string[] ten = {"",
                        "",
                        "twenty",
                        "thirty",
                        "forty",
                        "fifty",
                        "sixty",
                        "seventy",
                        "eighty",
                        "ninety"};
        int sum = 0;
        map<integer, integer> ones = new hashmap<>();
        map<integer, integer> teens = new hashmap<>();
        map<integer, integer> tens = new hashmap<>();
        for (int i = 0; i < 10; i++) {
            ones.put(i, nums[i].length());
        }
        for (int i = 10; i < nums.length; i++) {
            teens.put(i, nums[i].length());
        }
        for (int i = 0; i < ten.length; i++) {
            tens.put(i * 10, ten[i].length());
        }
        for (int i = 1; i < 1000; i++) {
            int num = 0;
            int n = i % 100;
            if (n > 19 || n < 10) {
                num += ones.get(n % 10);
                num += tens.get(n - n % 10);
            }
            else {
                num += teens.get(n);
            }
            if (i > 99) {
                num += n == 0 ? "hundred".length() : "hundredand".length();
            }
            num += ones.get(i / 100);
            sum += num;
//            system.out.printf("%2d %3d %5d%n", num, i, sum);
        }
        sum += ("onethousand").length();
        // actual is 21124
        system.out.println(sum);
    }
}

當我運行上面的程式碼時,我得到以下結果:

21124

在您問題的程式碼中,您(在程式碼註解中)寫道,這是預期的答案。

以上是ProjectEuler 問題 17:我更改了這一行程式碼,我的答案發生了巨大變化,儘管我認為它應該可以正常工作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除