鱼C论坛

 找回密码
 立即注册
查看: 1854|回复: 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中。

下面是一个可能的解决方案:
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[hundreds]);
                strcat(buffer, " HUNDRED ");
            }
            
            if (tens_and_ones >= 10 && tens_and_ones <= 19) {
                strcat(buffer, teens[tens_and_ones - 10]);
            } else {
                int tens = tens_and_ones / 10;
                int ones = tens_and_ones % 10;
                
                if (tens > 0) {
                    strcat(buffer, tens[tens]);
                    strcat(buffer, " ");
                }
                
                if (ones > 0) {
                    strcat(buffer, digits[ones]);
                    strcat(buffer, " ");
                }
            }
            
            strcat(buffer, powers[index]);
            strcat(buffer, " ");
        }
        
        amount /= 1000;
        index++;
    }
    
    // 移除最后一个空格
    buffer[strlen(buffer) - 1] = '\0';
}

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

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

使用道具 举报

发表于 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[thousands / 100] + " HUNDRED ";                thousands %= 100;            }            if (thousands >= 20) {                result += tens[thousands / 10] + " ";                thousands %= 10;            }            else if (thousands >= 10) {                result += teens[thousands - 10] + " ";                thousands = 0;            }            if (thousands > 0) {                result += ones[thousands] + " ";            }            result += "THOUSAND ";            amount %= 1000;        }        // 处理百位和十位数        if (amount >= 100) {            result += ones[amount / 100] + " HUNDRED ";            amount %= 100;        }        if (amount >= 20) {            result += tens[amount / 10] + " ";            amount %= 10;        }        else if (amount >= 10) {            result += teens[amount - 10] + " ";            amount = 0;        }        // 处理个位数        if (amount > 0) {            result += ones[amount] + " ";        }    }    // 将结果拷贝到缓冲区中    strncpy(buffer, result.c_str(), result.size());    buffer[result.size()] = '\0';}int main() {    unsigned int amount = 16312;    char buffer[100];    written_amount(amount, buffer);    std::cout << buffer << std::endl;    return 0;}
这个函数使用了几个字符串数组来存储数字的单词形式,通过对给定的数值进行拆分和处理,将其转换为相应的单词,并将结果存储在缓冲区中。

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-3 10:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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