davidmou 发表于 2023-11-1 15:40:51

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

编写一个函数,
void written_amount(unsigned int amount,char *buffer);

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

isdkz 发表于 2023-11-1 15:41:08

这个问题可以通过使用循环和条件语句来解决。首先,我们可以创建一个数组来存储数字对应的英文单词。然后,我们可以按照千位、百位、十位和个位的顺序将amount的每个数字转换成对应的英文单词,并将其存储到buffer中。

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

void written_amount(unsigned int amount, char *buffer) {
    const char *digits[] = {
      "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"
    };
    const char *teens[] = {
      "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"
    };
    const char *tens[] = {
      "", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"
    };
    const char *powers[] = {
      "", "THOUSAND", "MILLION", "BILLION"
    };
   
    if (amount == 0) {
      strcpy(buffer, "ZERO");
      return;
    }
   
    int index = 0;
    while (amount > 0) {
      if (amount % 1000 != 0) {
            int part = amount % 1000;
            int hundreds = part / 100;
            int tens_and_ones = part % 100;
            
            if (hundreds > 0) {
                strcat(buffer, digits);
                strcat(buffer, " HUNDRED ");
            }
            
            if (tens_and_ones >= 10 && tens_and_ones <= 19) {
                strcat(buffer, teens);
            } else {
                int tens = tens_and_ones / 10;
                int ones = tens_and_ones % 10;
               
                if (tens > 0) {
                  strcat(buffer, tens);
                  strcat(buffer, " ");
                }
               
                if (ones > 0) {
                  strcat(buffer, digits);
                  strcat(buffer, " ");
                }
            }
            
            strcat(buffer, powers);
            strcat(buffer, " ");
      }
      
      amount /= 1000;
      index++;
    }
   
    // 移除最后一个空格
    buffer = '\0';
}


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

请注意,这个解决方案假设buffer参数足够大,以便存储转换后的字符串。如果buffer的长度有限,请确保足够大以容纳转换后的字符串。

Mike_python小 发表于 2023-11-1 15:42:54

C/C++交流

下面是一个C++函数的实现,可以将给定的数值转换为单词形式并保存到缓冲区中:


#include <iostream>
#include <string>

void written_amount(unsigned int amount, char *buffer) {
    // 数字对应的单词形式
    std::string ones[] = {"", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"};
    std::string teens[] = {"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};
    std::string tens[] = {"", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"};

    std::string result;

    if (amount == 0) {
      result = "ZERO";
    }
    else {
      // 处理万位数
      if (amount >= 10000) {
            unsigned int thousands = amount / 1000;
            if (thousands >= 100) {
                result += ones + " HUNDRED ";
                thousands %= 100;
            }
            if (thousands >= 20) {
                result += tens + " ";
                thousands %= 10;
            }
            else if (thousands >= 10) {
                result += teens + " ";
                thousands = 0;
            }
            if (thousands > 0) {
                result += ones + " ";
            }
            result += "THOUSAND ";
            amount %= 1000;
      }

      // 处理百位和十位数
      if (amount >= 100) {
            result += ones + " HUNDRED ";
            amount %= 100;
      }
      if (amount >= 20) {
            result += tens + " ";
            amount %= 10;
      }
      else if (amount >= 10) {
            result += teens + " ";
            amount = 0;
      }

      // 处理个位数
      if (amount > 0) {
            result += ones + " ";
      }
    }

    // 将结果拷贝到缓冲区中
    strncpy(buffer, result.c_str(), result.size());
    buffer = '\0';
}

int main() {
    unsigned int amount = 16312;
    char buffer;
    written_amount(amount, buffer);
    std::cout << buffer << std::endl;
    return 0;
}


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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

davidmou 发表于 2023-11-1 22:44:46

可不可以用动态规划,或者递归{:9_228:}

zhangchenyvn 发表于 2024-2-19 13:57:35

davidmou 发表于 2023-11-1 22:44
可不可以用动态规划,或者递归

有点难。。。
页: [1]
查看完整版本: 把一个值变为一连串的单词