题解 | #学英语#
学英语
https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc
#include <stdio.h> static char base[][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; static char baseTen[][8] = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; static char unit[][10] = {"", " thousand", " million"}; int main(int argc, char** argv) { int input, data[3]; while(scanf("%d", &input) != EOF) { if(input == 0) { printf("%s", base[0]); continue; } unsigned char flag = 0; for (int i = 0; i < 3; i++) { // 通过对1000求余得到后三位数字 // i=0储存个位数,i=1储存千,i=2储存百万 data[i] = input % 1000; if(data[i]) { // flag 逻辑或运算便于之后判断是否需要加单位 flag = flag | 0x1 << i; } input /= 1000; } for(int i = 2; i >= 0; i--) { if(data[i] / 100) { // 如果百位不是0 printf("%s hundred", base[data[i] / 100]); data[i] %= 100; // 如果十位个位有数字 if(data[i] % 100) { printf(" and "); } } if(data[i] >= 20) { printf("%s", baseTen[data[i]/10 - 2]); data[i] %= 10; // 如果个位还有数字,预留一个空格 if(data[i]) { printf(" "); } } if(data[i]) { printf("%s", base[data[i]]); } //如果标记过 if(flag & (0x1 << i)) { printf("%s", unit[i]); flag &= ~(0x1 << i); // 取消标记 // 如果后面还有数字,预留出来空格 if(flag) { printf(" "); } } } } return 0; }