Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Project Euler #17 (java) [closed]

Tags:

java

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.

like image 308
mattboy Avatar asked Jul 02 '26 06:07

mattboy


1 Answers

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.

like image 158
Roger Lindsjö Avatar answered Jul 04 '26 18:07

Roger Lindsjö



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!