将数字以单词形式输出(C语言实现)
程序简单地实现了输入不大于九位的数字,以英文单词的形式输出。
在小的位数上使用了暴力穷举的方法实现数字转换为单词,使得比较代码冗长……
基本方法是先将九位数分割成三段分别处理,不足九位,则高位补零。
定义头文件和函数:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 void written_amount(int num,char *buffer); 5 void written_three(int num,char *buffer); 6 void written_two(int a,char *buffer);
主函数:
int main(void) { int num; char *buffer; buffer=malloc(sizeof(char *)*200) ; printf("Enter the number:"); scanf("%d",&num); written_amount(num,buffer); printf("The %d's homologous string is :\n %s\n",num,buffer); return 0; }
write_amount函数:
先将输入的数字分成三部分,分别赋给num3、num2、num1;例如:输入的是12345,则num3=0;num2=12,num1=345;
声明三个字符串指针,用来将num1、num2、num3分别转换成字符串后赋给buffer1、buffer2、buffer3.这需要调用written_three函数。
最后将buffer1、2和3分别判断是否为“zero”,不是的话将它们拼接到一起赋值给buffer。
1 void written_amount(int num,char *buffer) 2 { 3 //分配三个字符串指针,用来接收分别来自num1,num2和num3的字符串 4 5 char *buffer1=NULL,*buffer2=NULL,*buffer3=NULL; 6 buffer1=malloc(sizeof(char*)*40); 7 buffer2=malloc(sizeof(char*)*40); 8 buffer3=malloc(sizeof(char*)*40); 9 int count=1; 10 int x=num/10; 11 while(x!=0){ 12 count++; 13 x=x/10; 14 } 15 // printf("%d\n",count); 16 int num1=0,num2=0,num3=0; 17 //将要转换的数值num以每三位为一组分割给num1,num2,num3 18 if(count>=1 && count<=3){ 19 num1=num; 20 } 21 else if(count>3 && count<=6){ 22 num1=num%1000; 23 num2=num/1000; 24 } 25 else{ 26 num1=num%1000; 27 num2=(num/1000)%1000; 28 num3=num/1000000; 29 } 30 //调用written_three函数三次,分别将三个数字输出为英语字符形式 31 written_three(num1,buffer1); 32 33 written_three(num2,buffer2); 34 35 written_three(num3,buffer3); 36 //将buffer1、2、3的值copy给buffer,如果为零则忽略 37 if(!strcmp(buffer3,"zero")) { 38 39 if(!strcmp(buffer2,"zero")){ 40 41 strcpy(buffer,buffer1); 42 43 } 44 else{ 45 strcpy(buffer,buffer2); 46 strcat(buffer," thousand and "); 47 strcat(buffer,buffer1); 48 } 49 } 50 else{ 51 strcpy(buffer,buffer3); 52 strcat(buffer," million and "); 53 strcat(buffer,buffer2); 54 strcat(buffer," thousand and "); 55 strcat(buffer,buffer1); 56 } 57 //接收完毕将buffer1、buffer2和buffer3连接起来copy给buffer 58 }
written_three函数:
这个简单的函数用同样的原理,先判断是否满三位数,不满三位,则直接调用write_two函数,否则,先判断最高位,将其转化为字符串buffer,然后和调用write_two函数返回的字符串
拼接,返回结果。
1 void written_three(int num,char *buffer) 2 { 3 int n=num%100; 4 char *p; 5 p=malloc(sizeof(char *)*40); 6 // printf("%d\n",n); 7 //判断num是否是0,是的话直接返回buffer=NULL,否则判断它的位数,返回对应的英文字符 8 if(num/100==0){ 9 written_two(num,buffer); 10 // printf("%s\n",buffer); 11 } 12 else { 13 switch(num/100){ 14 case 1: strcpy(buffer,"one hundred "); break; 15 case 2: strcpy(buffer,"two hundred "); break; 16 case 3: strcpy(buffer,"three hundred "); break; 17 case 4: strcpy(buffer,"four hundred "); break; 18 case 5: strcpy(buffer,"five hundred "); break; 19 case 6: strcpy(buffer,"six hundred "); break; 20 case 7: strcpy(buffer,"seven hundred "); break; 21 case 8: strcpy(buffer,"eight hundred "); break; 22 case 9: strcpy(buffer,"nine hundred "); break; 23 } 24 written_two(n,p); 25 // printf("%s\n",p); 26 strcat(buffer,p); 27 // printf("%s\n",buffer); 28 } 29 }
write_two函数(糟糕的穷举法,大神请忽略):
将二位数转化为对应的字符串。
1 void written_two(int a,char *buffer) 2 { 3 4 int count=1,i; 5 int x=a/10; 6 while(x!=0){ 7 count++; 8 x=x/10; 9 } 10 switch(count){ 11 case 1:{ 12 switch(a){ 13 case 0: strcpy(buffer,"zero"); break; 14 case 1: strcpy(buffer,"one"); break; 15 case 2: strcpy(buffer,"two"); break; 16 case 3: strcpy(buffer,"three"); break; 17 case 4: strcpy(buffer,"four"); break; 18 case 5: strcpy(buffer,"five"); break; 19 case 6: strcpy(buffer,"six"); break; 20 case 7: strcpy(buffer,"seven"); break; 21 case 8: strcpy(buffer,"eight"); break; 22 case 9: strcpy(buffer,"nine"); break; 23 } 24 }break; 25 case 2:{ 26 if(a%10==0){ 27 switch(a/10){ 28 case 1: strcpy(buffer,"ten"); break; 29 case 2: strcpy(buffer,"twenty"); break; 30 case 3: strcpy(buffer,"thirty"); break; 31 case 4: strcpy(buffer,"fourty"); break; 32 case 5: strcpy(buffer,"fifty"); break; 33 case 6: strcpy(buffer,"sixty"); break; 34 case 7: strcpy(buffer,"seventy"); break; 35 case 8: strcpy(buffer,"eighty"); break; 36 case 9: strcpy(buffer,"ninety"); break; 37 } 38 } 39 else if(a/10==1){ 40 switch(a%10){ 41 case 1: strcpy(buffer,"eleven"); break; 42 case 2: strcpy(buffer,"twelve"); break; 43 case 3: strcpy(buffer,"thirteen"); break; 44 case 4: strcpy(buffer,"fourteen"); break; 45 case 5: strcpy(buffer,"fifteen"); break; 46 case 6: strcpy(buffer,"sixteen"); break; 47 case 7: strcpy(buffer,"seventeen"); break; 48 case 8: strcpy(buffer,"eighteen"); break; 49 case 9: strcpy(buffer,"nineteen"); break; 50 } 51 } 52 else { 53 switch(a/10){ 54 case 2:{ 55 switch(a%10){ 56 case 1:strcpy(buffer,"twenty-one"); break; 57 case 2:strcpy(buffer,"twenty-two"); break; 58 case 3:strcpy(buffer,"twenty-three"); break; 59 case 4:strcpy(buffer,"twenty-four"); break; 60 case 5:strcpy(buffer,"twenty-five"); break; 61 case 6:strcpy(buffer,"twenty-six"); break; 62 case 7:strcpy(buffer,"twenty-seven"); break; 63 case 8:strcpy(buffer,"twenty-eight"); break; 64 case 9:strcpy(buffer,"twenty-nine"); break; 65 } 66 }break; 67 case 3:{ 68 switch(a%10){ 69 case 1:strcpy(buffer,"thirty-one"); break; 70 case 2:strcpy(buffer,"thirty-two"); break; 71 case 3:strcpy(buffer,"thirty-three"); break; 72 case 4:strcpy(buffer,"thirty-four"); break; 73 case 5:strcpy(buffer,"thirty-five"); break; 74 case 6:strcpy(buffer,"thirty-six"); break; 75 case 7:strcpy(buffer,"thirty-seven"); break; 76 case 8:strcpy(buffer,"thirty-eight"); break; 77 case 9:strcpy(buffer,"thirty-nine"); break; 78 } 79 } break; 80 case 4:{ 81 switch(a%10){ 82 case 1:strcpy(buffer,"fourty-one"); break; 83 case 2:strcpy(buffer,"fourty-two"); break; 84 case 3:strcpy(buffer,"fourty-three"); break; 85 case 4:strcpy(buffer,"fourty-four"); break; 86 case 5:strcpy(buffer,"fourty-five"); break; 87 case 6:strcpy(buffer,"fourty-six"); break; 88 case 7:strcpy(buffer,"fourty-seven"); break; 89 case 8:strcpy(buffer,"fourty-eight"); break; 90 case 9:strcpy(buffer,"fourty-nine"); break; 91 } 92 }break; 93 case 5:{ 94 switch(a%10){ 95 case 1:strcpy(buffer,"fifty-one"); break; 96 case 2:strcpy(buffer,"fifty-two"); break; 97 case 3:strcpy(buffer,"fifty-three"); break; 98 case 4:strcpy(buffer,"fifty-four"); break; 99 case 5:strcpy(buffer,"fifty-five"); break; 100 case 6:strcpy(buffer,"fifty-six"); break; 101 case 7:strcpy(buffer,"fifty-seven"); break; 102 case 8:strcpy(buffer,"fifty-eight"); break; 103 case 9:strcpy(buffer,"fifty-nine"); break; 104 } 105 }break; 106 case 6:{ 107 switch(a%10){ 108 case 1:strcpy(buffer,"sixty-one"); break; 109 case 2:strcpy(buffer,"sixty-two"); break; 110 case 3:strcpy(buffer,"sixty-three"); break; 111 case 4:strcpy(buffer,"sixty-four"); break; 112 case 5:strcpy(buffer,"sixty-five"); break; 113 case 6:strcpy(buffer,"sixty-six"); break; 114 case 7:strcpy(buffer,"sixty-seven"); break; 115 case 8:strcpy(buffer,"sixty-eight"); break; 116 case 9:strcpy(buffer,"sixty-nine"); break; 117 } 118 }break; 119 case 7:{ 120 switch(a%10){ 121 case 1:strcpy(buffer,"seventy-one"); break; 122 case 2:strcpy(buffer,"seventy-two"); break; 123 case 3:strcpy(buffer,"seventy-three"); break; 124 case 4:strcpy(buffer,"seventy-four"); break; 125 case 5:strcpy(buffer,"seventy-five"); break; 126 case 6:strcpy(buffer,"seventy-six"); break; 127 case 7:strcpy(buffer,"seventy-seven"); break; 128 case 8:strcpy(buffer,"seventy-eight"); break; 129 case 9:strcpy(buffer,"seventy-nine"); break; 130 } 131 }break; 132 case 8:{ 133 switch(a%10){ 134 case 1:strcpy(buffer,"eighty-one"); break; 135 case 2:strcpy(buffer,"eighty-two"); break; 136 case 3:strcpy(buffer,"eighty-three"); break; 137 case 4:strcpy(buffer,"eighty-four"); break; 138 case 5:strcpy(buffer,"eighty-five"); break; 139 case 6:strcpy(buffer,"eighty-six"); break; 140 case 7:strcpy(buffer,"eighty-seven"); break; 141 case 8:strcpy(buffer,"eighty-eight"); break; 142 case 9:strcpy(buffer,"eighty-nine"); break; 143 } 144 }break; 145 case 9:{ 146 switch(a%10){ 147 case 1:strcpy(buffer,"ninety-one"); break; 148 case 2:strcpy(buffer,"ninety-two"); break; 149 case 3:strcpy(buffer,"ninety-three"); break; 150 case 4:strcpy(buffer,"ninety-four"); break; 151 case 5:strcpy(buffer,"ninety-five"); break; 152 case 6:strcpy(buffer,"ninety-six"); break; 153 case 7:strcpy(buffer,"ninety-seven"); break; 154 case 8:strcpy(buffer,"ninety-eight"); break; 155 case 9:strcpy(buffer,"ninety-nine"); break; 156 } 157 }break; 158 } 159 } 160 }break; 161 default:printf("ERROR!"); exit(EXIT_FAILURE); 162 } 163 }
该程序冗长且杂乱,很多处代码相同,不过总算是实现了简单的功能。
程序在devcpp上运行通过。
2016-10-21 11:12:23