欧拉项目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
相关产品推荐
相关产品推荐

