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中文網其他相關文章!