第1个回答 2015-12-21
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/*
* 重复的部分可以查表
* 自己编,就好些,不复杂
*/
char* num_list0[20] = {
"","one","two","three","four",
"five","six","seven","eight","nine",
"ten","eleven","twelve","thirteen","fourteen",
"fifteen","sixteen","seventeen","eighteen","nineteen"
};
char* num_list1[10] = {
"","ten","twenty","thirty","fourty","fifty",
"sixty","seventy","eighty","ninety"
};
// 查表找英文,数字转换为可以读的单词
// “有数字” 表示 “有非零的数字”
void haveIt(int nI, char *num_str) {
unsigned len;
char aA[5];
char str[100];
itoa(nI,aA,10);
len = strlen(aA); // 数的长度
if (len==4) { // 四位数
// 查表找到千位数字的英文
sprintf(str,"%s thousand ",num_list0[aA[0]-'0']);
strcat(num_str,str);
if (aA[1] != '0') {
// 如果百位数字不为0,查表找到百位数字的英文
sprintf(str,"%s hundred ",num_list0[aA[1]-'0']);
strcat(num_str,str);
}
if ((aA[2]-'0')==1 && (aA[3]-'0')>0) {
// 如果十位数字为1,查表找20以下的十位数的英文
// 提前到了数的末尾
sprintf(str,"and %s\n",num_list0[atoi(aA+2)]);
strcat(num_str,str);
return;
}
if (aA[2] != '0') {
// 如果十位有数字,查表找到十位数字的英文
sprintf(str,"and %s",num_list1[aA[2]-'0']);
strcat(num_str,str);
}
if (aA[3] != '0') {
if (aA[2] != '0') {
// 只要十位有数字,而且个位也有数字,用 -连接个位到十位
sprintf(str,"-%s",num_list0[aA[3]-'0']);
strcat(num_str,str);
}
else {
// 十位或者百位没有数字,直接 and个位数字的英文
sprintf(str,"and %s",num_list0[aA[3]-'0']);// 1001
strcat(num_str,str);
}
}
} else if (len==3) { // 三位数
// 查表找到百位数字的英文
sprintf(str,"%s hundred ",num_list0[aA[0]-'0']);
strcat(num_str,str);
if ((aA[1]-'0')==1 && (aA[2]-'0')>0) {
// 如果十位数字为 1,查表找20以下的十位数的英文
// 提前到了数的末尾
sprintf(str,"and %s\n",num_list0[atoi(aA+1)]);
strcat(num_str,str);
return;
}
if (aA[1] != '0') {
// 如果十位有数字,查表找到十位数字的英文
sprintf(str,"and %s",num_list1[aA[1]-'0']);
strcat(num_str,str);
}
if (aA[2] != '0') {
if (aA[1] == '0') {
// 如果十位没有数字,直接 and个位数字的英文
sprintf(str,"and %s",num_list0[aA[2]-'0']);
strcat(num_str,str);
}
else {
// 十位有数字,而且个位也有数字,用 -连接个位到十位
sprintf(str,"-%s",num_list0[aA[2]-'0']);
strcat(num_str,str);
}
}
} else if (len==2) { // 两位数
if ((aA[0]-'0')==1 && (aA[1]-'0')>0) {
// 如果十位数字为 1,查表找20以下的十位数的英文
// 提前到了数的末尾
sprintf(str,"and %s\n",num_list0[atoi(aA)]);
strcat(num_str,str);
return;
}
// 如果已知这个数是两位数,查表找到十位数的英文
sprintf(str,"%s",num_list1[aA[0]-'0']);
strcat(num_str,str);
if (aA[1] != '0') {
// 如果个位有数字,用 -连接个位到十位
sprintf(str,"-%s",num_list0[aA[1]-'0']);
strcat(num_str,str);
}
}
}
int main() {
int nI;
char num_str[500];
printf("enter a number >=1 and <=9999\n");
do {
strcpy(num_str,"\0");
printf("\nenter 0 to exit\n");
printf("enter the number: ");
scanf("%d",&nI);
if (nI<=19) {
strcpy(num_str,num_list0[nI]);
} else {
haveIt(nI,num_str); // 找到输入数字的字符串
}
printf("%s\n",num_str);
} while(nI>=1 && nI<=9999);
return 0;
}