今天在CSDN上看到一篇文章,面试题: 数字转英文 数字发音,即将罗马数字表示的数字翻译成英文表达,我试了试有道,貌似有道和博主的显示方式有点出入,刚好下午有点时间所以就做做这一题,博主那个程序是将输入参数用数字表示的,我的做法是使用字符来做:
对于数字字符串,先得到数字的长度,然后从右到左每3个数字为一组进行显示,比如,对于数字1231234,就可以分成3组,分别是1,231,234,这样从左到右一次分别显示每一组,对于1231234的三组数字,第一组为1,所以输出one million,对于第二祖231,输出ttwo hundred and thirty-one thousand,对于第三组输出two hundred and thirty-four,使用有道的朋友可能知道有道就是这么显示的。
下面就来编码实现:
1.首先是求数字字符串的长度,这个简单;
2.然后就是将每3个数字分组,最左边一组可以没有三个数字,
3.输出每一组
在编码的过程中要使用到几个数组,分别存储英文中的数字表示,这里利用上面那篇博文中的数组,稍作修改,源代码如下
#include<stdio.h> #include<string.h> void outputGroup(char const *num, int start, int len); char *dig[9] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; char *tee[10] = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"}; char *ten[8] = {"Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"}; char *big[] = {"","", "Thousand", "Million", "Billion", "Trillion", "Quadrillion", "Sextillion", "Septillion", "Octillion", "Nonillion"}; int length = sizeof(big) / sizeof(char *);//求出big数组中元素的个数,为了方便处理,前两个为空串 /** *将罗马数字表示的数字转换为英文字母标识,参数为罗马数字标识 */ void process(char const *roman) { int len = strlen(roman); int size = len / 3; int headSize = len % 3; int i = 0; int pos = 0; //略去对数字进行检查的代码 if(headSize == 0) { headSize = 3; } else { size++; } //每3个数字一组处理,第一组可能不够三个 for(i = size; i > 0; i--) { if(i == size) { outputGroup(roman, pos, headSize); pos += headSize; } else { outputGroup(roman, pos, 3); pos += 3; } printf(" %s ", big[i]); } } /*输出一组数字*/ void outputGroup(char const *num, int start, int len) { int i = 0, j; while(len > 0) { if(len == 3) { printf("%s hundred and ",dig[num[start++] - '1']); } else if(len == 2){ i = num[start++] - '1'; if(i == 0) { printf("%s ", tee[num[start] - '0']); break; } else if(i > 0){ printf("%s", ten[i-1]); j = num[start] - '0'; if(j == 0) { break; } else { printf("-"); } } } else { printf("%s ", dig[num[start] - '1']); } len--; } } int main() { //process("36756123"); char num[100]; scanf("%s", num); // outputGroup(num, 0, 3); process(num); }