c语言 数字转换成单词

额。。有个作业要求输入从1到9999数字的英文。。。
怎样才能让电脑读出英文呢。。。不要太复杂的方法哦。。
对不起..要求是输入一个数..然后读出相应的英文...比如
enter the number: 3256
three thousand two hundred and fifty-six..

#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;
}
温馨提示:答案为网友推荐,仅供参考
第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;
}
第2个回答  2009-03-25
。。。

我只有个翻译的地址。

httpcn.com网络中国。

或者你可以下载个金山词霸。
第3个回答  2009-03-25
不会哎...希望楼下能回答.我也好学习学习..
相似回答