【发布时间】: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%。