C++数字转英文程序末尾零不显示 如何正确输出对应零?
问题根因
你当前逻辑的核心问题出在第一步的数字反转操作会直接丢弃原数字末尾的所有0:
比如输入4200时,反转循环执行过程如下:
- 初始num=4200,sum=0
- 第一次取余得0,sum=0*10+0=0,num=420
- 第二次取余得0,sum=0*10+0=0,num=42
- 第三次取余得2,sum=0*10+2=2,num=4
- 第四次取余得4,sum=2*10+4=24,num=0,循环结束
反转后num=24,原来的两个末尾0已经完全丢失,后续打印循环自然不会触发0的case。
解决方案1:改用字符串处理(推荐,逻辑最简单)
直接把用户输入的内容读为字符串,逐字符转换即可,完全不需要处理数字反转、丢0的问题:
#include <iostream> #include <string> using namespace std; int main() { string num_str; cin >> num_str; for (char c : num_str) { switch(c - '0') { // 字符转对应数字 case 1 : cout << "One "; break; case 2 : cout << "Two "; break; case 3 : cout << "Three "; break; case 4 : cout << "Four "; break; case 5 : cout << "Five "; break; case 6 : cout << "Six "; break; case 7 : cout << "Seven "; break; case 8 : cout << "Eight "; break; case 9 : cout << "Nine "; break; case 0 : cout << "Zero "; break; } } return 0; }
解决方案2:保留数字处理逻辑的修改方案
如果一定要用数字类型处理,放弃反转逻辑,改为先计算总位数,再从最高位逐位提取:
#include <iostream> using namespace std; int main() { int num, origin_num, digit_count = 0, divisor = 1; cin >> num; origin_num = num; // 先计算数字总位数,do-while兼容输入为0的场景 do { digit_count++; divisor *= 10; num /= 10; } while (num > 0); divisor /= 10; // 得到最高位的除数,比如4200的divisor是1000 num = origin_num; while (digit_count > 0) { int current_digit = num / divisor; // 取当前最高位 switch(current_digit) { case 1 : cout << "One "; break; case 2 : cout << "Two "; break; case 3 : cout << "Three "; break; case 4 : cout << "Four "; break; case 5 : cout << "Five "; break; case 6 : cout << "Six "; break; case 7 : cout << "Seven "; break; case 8 : cout << "Eight "; break; case 9 : cout << "Nine "; break; case 0 : cout << "Zero "; break; } num %= divisor; // 去掉已经处理的最高位 divisor /= 10; digit_count--; } return 0; }
内容的提问来源于stack exchange,提问作者Fatima Khan
相关产品推荐
相关产品推荐

