java Project Euler 17错误答案
我做第17题有困难
如果数字1到5是用文字写出来的:一、二、三、四、五,那么总共使用了3+3+5+4+4=19个字母
如果所有从1到1000(一千)的数字都是用文字写出来的,那么会使用多少个字母
注意:不要计算空格或连字符。例如,342(三百四十二)包含23个字母,115(一百一十五)包含20个字母 信件。写数字时使用“and”符合英国用法
我的程序的输出是17722,但PE说这是一个错误的答案。我做错了什么?这是我的密码
public class NumberLetter {
public static void main(String[] args) {
String[] firstNormals = {"one","two","three","four","five","six","seven","eight","nine"};
String[] secondNormals = {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
String[] thirdNormals = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
String[] fourthNormals = {"oneHundred","twoHundred","threeHundred","fourHundred","fiveHundred","sixHundred","sevenHundred","eightHundred","nineHundred"};
String fifthNormal = "oneThousand";
long first = 0;
long second = 0;
long third = 0;
long fourth = 0;
for (int i = 0; i < firstNormals.length; i++) {
first += firstNormals[i].length();
}
for (int i = 0; i < secondNormals.length; i++) {
second += secondNormals[i].length();
}
for (int i = 0; i < thirdNormals.length; i++) {
third += thirdNormals[i].length();
}
for (int i = 0; i < fourthNormals.length; i++) {
fourth += fourthNormals[i].length()+third+second+first;
}
for (String thirdCharacters : thirdNormals) {
for (String firstCharacters : firstNormals) {
third += thirdCharacters.length()+firstCharacters.length();
}
}
for (String fourthCharacters : fourthNormals) {
for (String thirdCharacters : thirdNormals) {
for (String firstCharacters : firstNormals) {
fourth += fourthCharacters.length()+3+thirdCharacters.length()+firstCharacters.length();
}
}
}
long sum = first+second+third+fourth+fifthNormal.length();
System.out.println(sum);
}
}
我怎样才能提高效率呢?提前谢谢
# 1 楼答案
使用
Map
的解决方案:# 2 楼答案
这里有一个很好的解释:
http://www.mathblog.dk/project-euler-17-letters-in-the-numbers-1-1000/
您可以使用这里给出的逻辑来提出一个更优雅、更高效的解决方案
关于你的具体解决方案,我不确定第四个循环在做什么。看起来你想增加100,200,300。。。,以及101,102,103。。。,201, 202, 203, ..., 以及110,111,112。。。,210, 211, 212, ..., 以及120,130,140。。。,220, 230, 240, ... 如果是这样的话,那么你并不是把它们都算在内。这个循环只运行了9次
# 3 楼答案
您的for循环非常混乱,请尝试对常见任务使用基于方法的方法
由于要计算每个字符串数组中的字母数,因此可以执行以下操作:
# 4 楼答案
代码需要一些逻辑来确定您正在查看的数字
这是一个粗略的方法,最多只能做1000件
这将产生
把它们加起来就得到了18451个
这个解释在另一个答案中给出,但你必须考虑1-9 10-19 成百上千 成千上万
对于
912
首先,12-->;因为912的长度是3
第二,9
1
2-->;如果它是1,那么这意味着它是10-19,以确定我们使用下一个数字912
,它可以用作数组中的索引,以获得12