【问题标题】:C++ converting number to wordsC ++将数字转换为单词
【发布时间】:2017-03-08 06:10:48
【问题描述】:

我在一本书中遇到了这个程序,可以将数字转换为单词。初始程序转换数字 1-1000,但随后您被要求修改程序以接受最多 1,000,000 的数字。我让它与高达 20,999 的数字一起工作,但无法让它超过这个数字。我整天都在修改它,并在网上查看了很多程序示例,但我看到的每个人都在使用超出我作为初学者的技术。任何建议将不胜感激。这是我目前所拥有的。

#include <iostream>
#include <string>
using namespace std;

string digitName(int digit);
string teenName(int number);
string tensName(int number);
string intName(int number);


int main()
{
    int input;

    do
    {

    cout << "Please enter a positive integer: ";

    cin >> input;

    cout << "\n" << intName(input) << endl;

    cout << "\n\n" << endl;

    }while (input > 0);

    return 0;
}

string digitName(int digit)
{
    if (digit == 1) return "one";
    if (digit == 2) return "two";
    if (digit == 3) return "three";
    if (digit == 4) return "four";
    if (digit == 5) return "five";
    if (digit == 6) return "six";
    if (digit == 7) return "seven";
    if (digit == 8) return "eight";
    if (digit == 9) return "nine";

    return "";
}

string teenName(int number)
{
    if (number == 10) return "ten";
    if (number == 11) return "eleven";
    if (number == 12) return "twelve";
    if (number == 13) return "thirteen";
    if (number == 14) return "fourteen";
    if (number == 15) return "fifteen";
    if (number == 16) return "sixteen";
    if (number == 17) return "seventeen";
    if (number == 18) return "eighteen";
    if (number == 19) return "nineteen";

    return "";
}

string tensName(int number)
{
    if (number >= 90) return "ninety";
    if (number >= 80) return "eighty";
    if (number >= 70) return "seventy";
    if (number >= 60) return "sixty";
    if (number >= 50) return "fifty";
    if (number >= 40) return "fourty";
    if (number >= 30) return "thirty";
    if (number >= 20) return "twenty";

    return "";
}

string intName(int number)
{
    int part = number;
    string name;

    if (part >= 20000)
    {
        if (part % 10000 == 0)
        {
            name = tensName(part / 1000) + " thousand ";
            part = part % 1000;

        }else
        {
            name = tensName(part / 1000) + " ";
            part = part % 10000;
        }
    }

    if (part >= 10000)
    {
        name = teenName(part / 1000) + " thousand ";
        part = part % 1000;
    }

    if (part >= 1000)
    {
        name = digitName(part / 1000) + " thousand ";
        part = part % 1000;
    }

    if (part >= 100)
    {
        name = name + digitName(part / 100) + " hundred";
        part = part % 100;
    }

    if (part >= 20)
    {
        name = name + " " + tensName(part);
        part = part % 10;

    }else if (part >= 10)
    {
        name = name + " " + teenName(part);
        part = 0;
    }

    if (part > 0)
    {
        name = name + " " + digitName(part);
    }

    return name;
}

【问题讨论】:

  • 使用递归来避免重复这么多代码。
  • @FengyangWang 我知道有很多更简洁的方法来编写代码以获得相同的结果。我一直在看这里的一些。但是我是初学者,这就是我现在使用的书的呈现方式。
  • 将数字读入字符串然后解析字符串会不会作弊?
  • 你为什么不得到字符串的长度,然后它会给你一个想法是十万还是一百万。然后你可以用digitname开头说five十万...
  • @iriejams -- 试试这个方法。您唯一需要知道如何转换的就是从 1 到 999 的数字。其他任何事情只需将十亿、百万和千位放在每组三位数字之间即可。现在,您已经硬编码了 20000、10000 等——没有必要。只需专注于三位数字,您就完成了 90%。

标签: c++ string int


【解决方案1】:

两件事:如果你只是索引一个数组,你可以为自己节省很多。您可以通过在数百个案例后重复实现该问题来更一般地解决该问题。数千、数百万、数十亿、万亿和千万亿都遵循完全相同的模式,因此可以递归完成。

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;

    string digitName(int digit);
    string teenName(int number);
    string tensName(int number);
    string intName(int number);

    vector<string> ones {"","one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    vector<string> teens {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen","sixteen", "seventeen", "eighteen", "nineteen"};
    vector<string> tens {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    string nameForNumber (long number) {
        if (number < 10) {
            return ones[number];
        } else if (number < 20) {
            return teens [number - 10];
        } else if (number < 100) {
            return tens[number / 10] + ((number % 10 != 0) ? " " + nameForNumber(number % 10) : "");
        } else if (number < 1000) {
            return nameForNumber(number / 100) + " hundred" + ((number % 100 != 0) ? " " + nameForNumber(number % 100) : "");
        } else if (number < 1000000) {
            return nameForNumber(number / 1000) + " thousand" + ((number % 1000 != 0) ? " " + nameForNumber(number % 1000) : "");
        } else if (number < 1000000000) {
            return nameForNumber(number / 1000000) + " million" + ((number % 1000000 != 0) ? " " + nameForNumber(number % 1000000) : "");
        } else if (number < 1000000000000) {
            return nameForNumber(number / 1000000000) + " billion" + ((number % 1000000000 != 0) ? " " + nameForNumber(number % 1000000000) : "");
        }
        return "error";
    }

    int main()
    {
        long input;
        do
        {
            cout << "Please enter a positive integer: ";    
            cin >> input;
            cout << "\n" << nameForNumber(input) << endl;
            cout << "\n\n" << endl;
        }while (input > 0);
        return 0;
    }

【讨论】:

  • 我想知道这种方法是否适用于不同的语言。我希望像 Boost::Locale 这样的东西可能已经集成了将数字转换为名称(反之亦然)。似乎 Boost::Locale 的 as::spellout 可以解决这个问题。
猜你喜欢
  • 2013-03-22
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多