鱼C论坛

 找回密码
 立即注册
查看: 1036|回复: 4

把一个值变为一连串的单词

[复制链接]
发表于 2023-11-1 15:40:51 | 显示全部楼层 |阅读模式
60鱼币
编写一个函数,
void written_amount(unsigned int amount,char *buffer);

他把amount表示的值转化为单词形式,并储存于buffer中,如amount的值为16312,那么buffer中存储的字符串应该是SIXTEEN THOUSAND THREE HUNDRED TWELVE

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 15:41:08 | 显示全部楼层
这个问题可以通过使用循环和条件语句来解决。首先,我们可以创建一个数组来存储数字对应的英文单词。然后,我们可以按照千位、百位、十位和个位的顺序将amount的每个数字转换成对应的英文单词,并将其存储到buffer中。

下面是一个可能的解决方案:

  1. void written_amount(unsigned int amount, char *buffer) {
  2.     const char *digits[] = {
  3.         "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"
  4.     };
  5.     const char *teens[] = {
  6.         "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"
  7.     };
  8.     const char *tens[] = {
  9.         "", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"
  10.     };
  11.     const char *powers[] = {
  12.         "", "THOUSAND", "MILLION", "BILLION"
  13.     };
  14.    
  15.     if (amount == 0) {
  16.         strcpy(buffer, "ZERO");
  17.         return;
  18.     }
  19.    
  20.     int index = 0;
  21.     while (amount > 0) {
  22.         if (amount % 1000 != 0) {
  23.             int part = amount % 1000;
  24.             int hundreds = part / 100;
  25.             int tens_and_ones = part % 100;
  26.             
  27.             if (hundreds > 0) {
  28.                 strcat(buffer, digits[hundreds]);
  29.                 strcat(buffer, " HUNDRED ");
  30.             }
  31.             
  32.             if (tens_and_ones >= 10 && tens_and_ones <= 19) {
  33.                 strcat(buffer, teens[tens_and_ones - 10]);
  34.             } else {
  35.                 int tens = tens_and_ones / 10;
  36.                 int ones = tens_and_ones % 10;
  37.                
  38.                 if (tens > 0) {
  39.                     strcat(buffer, tens[tens]);
  40.                     strcat(buffer, " ");
  41.                 }
  42.                
  43.                 if (ones > 0) {
  44.                     strcat(buffer, digits[ones]);
  45.                     strcat(buffer, " ");
  46.                 }
  47.             }
  48.             
  49.             strcat(buffer, powers[index]);
  50.             strcat(buffer, " ");
  51.         }
  52.         
  53.         amount /= 1000;
  54.         index++;
  55.     }
  56.    
  57.     // 移除最后一个空格
  58.     buffer[strlen(buffer) - 1] = '\0';
  59. }
复制代码


这个函数使用了四个字符串数组来存储数字对应的英文单词。在循环中,我们从amount的个位开始,依次将每个部分转换成英文单词,并将其拼接到buffer中。最后,我们需要移除最后一个空格。

请注意,这个解决方案假设buffer参数足够大,以便存储转换后的字符串。如果buffer的长度有限,请确保足够大以容纳转换后的字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 15:42:54 | 显示全部楼层
C/C++交流

下面是一个C++函数的实现,可以将给定的数值转换为单词形式并保存到缓冲区中:
  1. #include <iostream>
  2. #include <string>
  3. void written_amount(unsigned int amount, char *buffer) {
  4.     // 数字对应的单词形式
  5.     std::string ones[] = {"", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"};
  6.     std::string teens[] = {"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};
  7.     std::string tens[] = {"", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"};
  8.     std::string result;
  9.     if (amount == 0) {
  10.         result = "ZERO";
  11.     }
  12.     else {
  13.         // 处理万位数
  14.         if (amount >= 10000) {
  15.             unsigned int thousands = amount / 1000;
  16.             if (thousands >= 100) {
  17.                 result += ones[thousands / 100] + " HUNDRED ";
  18.                 thousands %= 100;
  19.             }
  20.             if (thousands >= 20) {
  21.                 result += tens[thousands / 10] + " ";
  22.                 thousands %= 10;
  23.             }
  24.             else if (thousands >= 10) {
  25.                 result += teens[thousands - 10] + " ";
  26.                 thousands = 0;
  27.             }
  28.             if (thousands > 0) {
  29.                 result += ones[thousands] + " ";
  30.             }
  31.             result += "THOUSAND ";
  32.             amount %= 1000;
  33.         }
  34.         // 处理百位和十位数
  35.         if (amount >= 100) {
  36.             result += ones[amount / 100] + " HUNDRED ";
  37.             amount %= 100;
  38.         }
  39.         if (amount >= 20) {
  40.             result += tens[amount / 10] + " ";
  41.             amount %= 10;
  42.         }
  43.         else if (amount >= 10) {
  44.             result += teens[amount - 10] + " ";
  45.             amount = 0;
  46.         }
  47.         // 处理个位数
  48.         if (amount > 0) {
  49.             result += ones[amount] + " ";
  50.         }
  51.     }
  52.     // 将结果拷贝到缓冲区中
  53.     strncpy(buffer, result.c_str(), result.size());
  54.     buffer[result.size()] = '\0';
  55. }
  56. int main() {
  57.     unsigned int amount = 16312;
  58.     char buffer[100];
  59.     written_amount(amount, buffer);
  60.     std::cout << buffer << std::endl;
  61.     return 0;
  62. }
复制代码

这个函数使用了几个字符串数组来存储数字的单词形式,通过对给定的数值进行拆分和处理,将其转换为相应的单词,并将结果存储在缓冲区中。

希望这个回答对您有帮助!如果您有任何问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-1 22:44:46 | 显示全部楼层
可不可以用动态规划,或者递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-19 13:57:35 | 显示全部楼层
davidmou 发表于 2023-11-1 22:44
可不可以用动态规划,或者递归

有点难。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 01:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表