博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
把数字数值转换成单词形式
阅读量:4533 次
发布时间:2019-06-08

本文共 9280 字,大约阅读时间需要 30 分钟。

原文:

《C和指针》第7章第6道编程题:

编写函数

 void written_amount( unsigned int amount, char *buffer ); 

它把 amount 表示的值转换为单词形式,并存储于 buffer 中。这个函数可以在一个打印支票的程序中使用。例如,如果 amount 的值是 16 312,那么 buffer 中存储的字符串应该是

  SIXTEEN THOUSAND THREE HUNDRED TWELVE

调用程序保证 buffer 缓冲区的空间足够大。例如,1 200 可以是 ONE THOUSAND TWO HUNDRED 或 TWELVE HUNDRED。你可以选择一种你喜欢的形式。

1 /*  2 ** 把非负整数数值转化为单词形式  3 */  4   5 #include 
6 #include
7 8 void written_amount( unsigned int amount, char *buffer ); 9 10 int 11 main() 12 { 13 unsigned int num; 14 scanf( "%u", &num ); 15 char b[100] = { 0 }; 16 17 written_amount( num, b ); 18 19 puts( b ); 20 21 return 0; 22 } 23 24 /* 25 ** 函数功能:把amount的值转化为单词形式,结果存储在buffer中 26 */ 27 void 28 written_amount( unsigned int amount, char *buffer ) 29 { 30 /* 31 ** 数字对应的单词,分为4组 32 */ 33 char word_1_9[10][6] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", 34 "SIX", "SEVEN", "EIGHT", "NINE" }; 35 char word_10_19[10][10] = {
"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", 36 "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN" }; 37 char word_ty[10][8] = { "", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", 38 "SIXTY", "SEVENTY", "EIGHTY", "NINETY" }; 39 char word_div[4][9] = { "HUNDRED", "THOUSAND", "MILLION", "BILLION" }; 40 41 static int count = 0; // 记录千分位的个数 42 unsigned int tmp = amount / 1000; 43 44 /* 45 ** 用递归函数,直到数值< 1000 46 */ 47 if( tmp ) 48 { 49 count ++; // 千分位的个数增加 50 written_amount( tmp, buffer ); // 递归,处理下一个千分位 51 } 52 53 int val = amount % 1000; // 3位3位地进行转化单词 54 55 /* 56 ** 值大于100,先把百位上的数的单词存到buffer中 57 ** 后面加上 HUNDRED 58 ** 把值%100,变成两位数,后续继续处理 59 */ 60 if( val >= 100 ) 61 { 62 strcat( buffer, word_1_9[ val / 100 ] ); 63 strcat( buffer, " " ); 64 strcat( buffer, word_div[ 0 ] ); 65 val %= 100; 66 } 67 68 /* 69 ** 值在20至99之间,先把几十对应的单词加到buffer中 70 ** 再%10,后续处理个位上的数 71 */ 72 if( val >= 20 && val <= 99 ) 73 { 74 strcat( buffer, " " ); 75 strcat( buffer, word_ty[ val / 10 ] ); 76 val %= 10; 77 } 78 79 /* 80 ** 值在10到19之间,直接把对应的单词加到buffer中 81 */ 82 if( val >= 10 && val <= 19 ) 83 { 84 strcat( buffer, " " ); 85 strcat( buffer, word_10_19[ val % 10 ] ); 86 } 87 88 /* 89 ** 值在0到9之间,把对应的单词加到buffer中 90 */ 91 if( val >= 0 && val <= 9 ) 92 { 93 strcat( buffer, " " ); 94 strcat( buffer, word_1_9[ val ] ); 95 } 96 97 /* 98 ** 一个千位处理完后,后面加上对应的分位单词"THOUSAND"、"MILLION"等 99 */100 if( count > 0 )101 {102 strcat( buffer, " " );103 strcat( buffer, word_div[ count-- ] );104 strcat( buffer, " " );105 }106 }

 以上版本处理个位是0的数字会多显示ZERO,下面这个版本进行改进:

1 /*  2 ** 把非负整数数值转化为单词形式  3 ** 2.0版本,改进:  4 **       个位为 0 的数字多输出 ZERO 的问题  5 */  6   7 #include 
8 #include
9 10 void written_amount( unsigned int amount, char *buffer ); 11 12 int 13 main() 14 { 15 unsigned int num1, num2; 16 scanf( "%u%u", &num1, &num2 ); 17 char b1[100] = { 0 }; 18 char b2[100] = { 0 }; 19 20 written_amount( num1, b1 ); 21 22 puts( b1 ); 23 24 written_amount( num2, b2 ); 25 26 puts( b2 ); 27 28 return 0; 29 } 30 31 /* 32 ** 函数功能:把amount的值转化为单词形式,结果存储在buffer中 33 */ 34 void 35 written_amount( unsigned int amount, char *buffer ) 36 { 37 /* 38 ** 数字对应的单词,分为4组 39 */ 40 char word_1_9[10][6] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", 41 "SIX", "SEVEN", "EIGHT", "NINE" }; 42 char word_10_19[10][10] = {
"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", 43 "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN" }; 44 char word_ty[10][8] = { "", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", 45 "SIXTY", "SEVENTY", "EIGHTY", "NINETY" }; 46 char word_div[4][9] = { "HUNDRED", "THOUSAND", "MILLION", "BILLION" }; 47 48 /* 49 ** 如果amount=0,则直接输出ZERO 50 */ 51 if( amount == 0 ) 52 strcat( buffer, word_1_9[ 0 ] ); 53 54 /* 55 ** amount不等于0,用下面的方法处理 56 */ 57 static int count = 0; // 记录千分位的个数 58 unsigned int tmp = amount / 1000; 59 60 /* 61 ** 用递归函数,直到数值< 1000 62 */ 63 if( tmp ) 64 { 65 count ++; // 千分位的个数增加 66 written_amount( tmp, buffer ); // 递归,处理下一个千分位 67 } 68 69 int val = amount % 1000; // 3位3位地进行转化单词 70 71 /* 72 ** 值大于100,先把百位上的数的单词存到buffer中 73 ** 后面加上 HUNDRED 74 ** 把值%100,变成两位数,后续继续处理 75 */ 76 if( val >= 100 ) 77 { 78 strcat( buffer, word_1_9[ val / 100 ] ); 79 strcat( buffer, " " ); 80 strcat( buffer, word_div[ 0 ] ); 81 val %= 100; 82 } 83 84 /* 85 ** 值在20至99之间,先把几十对应的单词加到buffer中 86 ** 再%10,后续处理个位上的数 87 */ 88 if( val >= 20 && val <= 99 ) 89 { 90 strcat( buffer, " " ); 91 strcat( buffer, word_ty[ val / 10 ] ); 92 val %= 10; 93 } 94 95 /* 96 ** 值在10到19之间,直接把对应的单词加到buffer中 97 */ 98 if( val >= 10 && val <= 19 ) 99 {100 strcat( buffer, " " );101 strcat( buffer, word_10_19[ val % 10 ] );102 }103 104 /*105 ** 值在0到9之间,把对应的单词加到buffer中106 */107 if( val > 0 && val <= 9 )108 {109 strcat( buffer, " " );110 strcat( buffer, word_1_9[ val ] );111 }112 113 /*114 ** 一个千位处理完后,后面加上对应的分位单词"THOUSAND"、"MILLION"等115 */116 if( count > 0 )117 {118 strcat( buffer, " " );119 strcat( buffer, word_div[ count-- ] );120 strcat( buffer, " " );121 }122 }

 以上2.0版本,1000000 、1000000000 等数字多输出分位单词,以下3.0版本对此进行修正:

1 /*  2 ** 把非负整数数值转化为单词形式  3 ** 3.0版本,在2.0的基础上改进:  4 **       1000000 多输出 THOUSAND 的问题  5 */  6   7 #include 
8 #include
9 10 void written_amount( unsigned int amount, char *buffer ); 11 12 int 13 main() 14 { 15 unsigned int num1, num2; 16 scanf( "%u%u", &num1, &num2 ); 17 char b1[100] = { 0 }; 18 char b2[100] = { 0 }; 19 20 written_amount( num1, b1 ); 21 22 puts( b1 ); 23 24 written_amount( num2, b2 ); 25 26 puts( b2 ); 27 28 return 0; 29 } 30 31 /* 32 ** 函数功能:把amount的值转化为单词形式,结果存储在buffer中 33 */ 34 void 35 written_amount( unsigned int amount, char *buffer ) 36 { 37 /* 38 ** 数字对应的单词,分为4组 39 */ 40 char word_1_9[10][6] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", 41 "SIX", "SEVEN", "EIGHT", "NINE" }; 42 char word_10_19[10][10] = {
"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", 43 "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN" }; 44 char word_ty[10][8] = { "", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", 45 "SIXTY", "SEVENTY", "EIGHTY", "NINETY" }; 46 char word_div[4][9] = { "HUNDRED", "THOUSAND", "MILLION", "BILLION" }; 47 48 /* 49 ** 如果amount=0,则直接输出ZERO 50 */ 51 if( amount == 0 ) 52 { 53 strcat( buffer, word_1_9[ 0 ] ); 54 return ; 55 } 56 57 /* 58 ** amount不等于0,用下面的方法处理 59 */ 60 static int count = 0; // 记录千分位的个数 61 unsigned int tmp = amount / 1000; 62 63 /* 64 ** 用递归函数,直到数值< 1000 65 */ 66 if( tmp ) 67 { 68 count ++; // 千分位的个数增加 69 written_amount( tmp, buffer ); // 递归,处理下一个千分位 70 } 71 72 int val = amount % 1000; // 3位3位地进行转化单词 73 74 if( val == 0 ) 75 { 76 count = 0; 77 return ; 78 } 79 /* 80 ** 值大于100,先把百位上的数的单词存到buffer中 81 ** 后面加上 HUNDRED 82 ** 把值%100,变成两位数,后续继续处理 83 */ 84 if( val >= 100 ) 85 { 86 strcat( buffer, word_1_9[ val / 100 ] ); 87 strcat( buffer, " " ); 88 strcat( buffer, word_div[ 0 ] ); 89 val %= 100; 90 } 91 92 /* 93 ** 值在20至99之间,先把几十对应的单词加到buffer中 94 ** 再%10,后续处理个位上的数 95 */ 96 if( val >= 20 && val <= 99 ) 97 { 98 strcat( buffer, " " ); 99 strcat( buffer, word_ty[ val / 10 ] );100 val %= 10;101 }102 103 /*104 ** 值在10到19之间,直接把对应的单词加到buffer中105 */106 if( val >= 10 && val <= 19 )107 {108 strcat( buffer, " " );109 strcat( buffer, word_10_19[ val % 10 ] );110 }111 112 /*113 ** 值在0到9之间,把对应的单词加到buffer中114 */115 if( val > 0 && val <= 9 )116 {117 strcat( buffer, " " );118 strcat( buffer, word_1_9[ val ] );119 }120 121 /*122 ** 一个千位处理完后,后面加上对应的分位单词"THOUSAND"、"MILLION"等123 */124 if( count > 0 )125 {126 strcat( buffer, " " );127 strcat( buffer, word_div[ count-- ] );128 strcat( buffer, " " );129 }130 }

 

posted on
2014-12-11 09:56 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/4156916.html

你可能感兴趣的文章
Oracle -操作数据库
查看>>
c - 给分数分级别
查看>>
chrome 调试
查看>>
luoguP2774 方格取数问题
查看>>
tcp/ip协议各层的理解与
查看>>
python中的setdefault()方法
查看>>
转 VSFTP用户权限管控
查看>>
poj2420 A Star not a Tree? 模拟退火
查看>>
微信小程序--登录授权,一键获取用户微信手机号并登录
查看>>
[转载] C#面向对象设计模式纵横谈——13. Proxy代理模式
查看>>
JqueryEasyUI浅谈---视频教程公布
查看>>
ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致”...
查看>>
Javaweb之 servlet 开发详解1
查看>>
Restore IP Addresses
查看>>
DWR框架简单应用
查看>>
KMP 学习心得-----转
查看>>
time.strftime:格式化字符串中含中文报错处理
查看>>
模态窗口缓存无法清除怎么办? 在地址上加个随机数吧"&rd=" + new Date().getTime()
查看>>
阿里的weex框架到底是什么
查看>>
Tesis enDYNA
查看>>