You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

欧拉项目17:数字转单词字母计数函数为何偶尔结果错误?

欧拉项目第17题:数字转英文单词字母计数问题排查

我在计算1到1000的数字写成英文单词后的字母总数时,结果不符合预期,需要排查代码问题。项目要求如下:

不计算空格或连字符,数字书写遵循英式用法(使用"and")。例如:
342(three hundred and forty-two)包含23个字母
115(one hundred and fifteen)包含20个字母

我的代码

#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;
}

问题排查与修正

代码中存在一处关键错误:

  • 数字17对应的英文单词是seventeen,字母总数为9,但代码中case 17分支错误地累加了10。将该行的output += 10;改为output += 9;即可修正。

修正后重新运行代码,计算结果会符合欧拉项目第17题的正确答案(21124)。

内容的提问来源于stack exchange,提问作者Carter Weaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:17:04