Carter Weaver
Carter Weaver

Reputation: 13

Why does this numeral (a word written out) letter counter function give a wrong result sometimes?

I am finding the sum of the numbers 1 to 1000 written (Euler project 17), but I can't see what's wrong.

This is the note from the project page: NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.

#include <stdio.h>

int intToLetter(int x)
{
    int output = 0;
    if (x == 1000) {
        return 11;
    }
    if (x / 100 != 0) {
        switch (x / 100)
        {
        case 1:
            output += 3;
            break;
        case 2:
            output += 3;
            break;
        case 3:
            output += 5;
            break;
        case 4:
            output += 4;
            break;
        case 5:
            output += 4;
            break;
        case 6:
            output += 3;
            break;
        case 7:
            output += 5;
            break;
        case 8:
            output += 5;
            break;
        case 9:
            output += 4;
            break;
        }
        output += 7;
        if (((x / 10) % 10) * 10 + x % 10 != 0)
        {
            output += 3;
        }
    }
    if (((x / 10) % 10) * 10 + x % 10 >= 10 && ((x / 10) % 10) * 10 + x % 10 <= 19) {
        switch (((x / 10) % 10) * 10 + x % 10) {
        case 10:
            output += 3;
            break;
        case 11:
            output += 6;
            break;
        case 12:
            output += 6;
            break;
        case 13:
            output += 8;
            break;
        case 14:
            output += 8;
            break;
        case 15:
            output += 7;
            break;
        case 16:
            output += 7;
            break;
        case 17:
            output += 10;
            break;
        case 18:
            output += 8;
            break;
        case 19:
            output += 8;
            break;
        }
    }
    else {
        switch ((x / 10) % 10)
        {
        case 2:
            output += 6;
            break;
        case 3:
            output += 5;
            break;
        case 4:
            output += 5;
            break;
        case 5:
            output += 5;
            break;
        case 6:
            output += 5;
            break;
        case 7:
            output += 7;
            break;
        case 8:
            output += 6;
            break;
        case 9:
            output += 6;
            break;
        }
        switch (x % 10)
        {
        case 1:
            output += 3;
            break;
        case 2:
            output += 3;
            break;
        case 3:
            output += 5;
            break;
        case 4:
            output += 4;
            break;
        case 5:
            output += 4;
            break;
        case 6:
            output += 3;
            break;
        case 7:
            output += 5;
            break;
        case 8:
            output += 5;
            break;
        case 9:
            output += 4;
            break;
        }
    }
    return output;
}

int main(void) {
    int sum = 0;
    for (int i = 1; i <= 1000; i++) {
        sum+=intToLetter(i);
    }
    printf("%i\n",sum);

    return 0;
}

Upvotes: -1

Views: 36

Answers (1)

chux
chux

Reputation: 154255

At least this problem:

`"thirty" has 6 characters

// case 3: output += 5;
case 3: output += 6;

Upvotes: 0

Related Questions