I'm working on Problem 17 at Project Euler. With the code below I'm getting 21088 as the answer which is wrong. I can't figure out where the problem is. Anyone know where I'm going wrong? Thanks.
public class Problem17 {
public static void main(String[] args) {
System.out.println(countLetters(1000));
}
public static long countLetters(int n) {
long sum = 0;
for (int i=1; i<=n; i++){
sum += getLetters(i);
}
return sum;
}
public static int getLetters(int n) {
int letters = 0;
switch (n) {
case 0: letters = 0; break;
case 1: letters = "One".length(); break;
case 2: letters = "Two".length(); break;
case 3: letters = "Three".length(); break;
case 4: letters = "Four".length(); break;
case 5: letters = "Five".length(); break;
case 6: letters = "Six".length(); break;
case 7: letters = "Seven".length(); break;
case 8: letters = "Eight".length(); break;
case 9: letters = "Nine".length(); break;
case 10: letters = "Ten".length(); break;
case 11: letters = "Eleven".length(); break;
case 12: letters = "Twelve".length(); break;
case 13: letters = "Thirteen".length(); break;
case 14: letters = "Fourteen".length(); break;
case 15: letters = "Fifteen".length(); break;
case 16: letters = "Sixteen".length(); break;
case 17: letters = "Seventeen".length(); break;
case 18: letters = "Eighteen".length(); break;
case 19: letters = "Nineteen".length(); break;
case 20: letters = "Twenty".length(); break;
case 30: letters = "Thirty".length(); break;
case 40: letters = "Forty".length(); break;
case 50: letters = "Fifty".length(); break;
case 60: letters = "Sixty".length(); break;
case 70: letters = "Seventy".length(); break;
case 80: letters = "Eighty".length(); break;
case 90: letters = "Ninety".length(); break;
case 100: letters = "OneHundred".length(); break;
case 200: letters = "TwoHundred".length(); break;
case 300: letters = "ThreeHundred".length(); break;
case 400: letters = "FourHundred".length(); break;
case 500: letters = "FiveHundred".length(); break;
case 600: letters = "SixHundred".length(); break;
case 700: letters = "SevenHundred".length(); break;
case 800: letters = "EightHundred".length(); break;
case 900: letters = "NineHundred".length(); break;
case 1000: letters = "OneThousand".length(); break;
}
if (letters == 0){
int length = (int)(Math.log10(n)+1); //how many digits does the number have?
int splitNumber;
for (int i=1;i<=length;i++){
if (i == 3) letters += 3; //add "and" to the total letters if necessary
splitNumber = (int) (n % Math.pow(10, i));
letters += getLetters(splitNumber);
n -= splitNumber;
}
}
return letters;
}
}
EDIT: Just noticed now that it's calculating for example 111 as "One Hundred And Ten One" D'OH! Won't have time to adjust this until later tonight, will update then.
Your problem is if you do not get a match form your case list, then you always split the number into separate digits, starting with the lower digit. So, for 114 you take the four, and have 110 left, then you take 10, and have 100 left. If you do it the other way around, so for 114 you remove the highest part (100), then you have 14 left which will work with your switch.
As a side note, there is very much symmetry in this problem, probably just takes a few minutes to do with pen and paper.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With