将非负整数转换为其英文单词表示。给定的输入保证小于 2 31 – 1。
例如,
123——“123”
12345—— “ 12345”
1234567——“1234567”
您是否看到将数字划分为单词块的模式?例如123和123000。
有很多边缘情况。有哪些好的测试用例?您的代码是否适用于诸如 0 之类的输入?还是1000010?中间块为零,不应打印出来
将数字分组为千位(3 位)。您可以编写一个辅助函数,该函数采用小于 1000 的数字并将该块转换为单词。
C++解决方案
-
某些 Corner 情况,0 为“零”,1000010 为“一百万十”(不应打印中间零)
-
不应打印额外的空格。
-
您可以使用迭代或递归来连接中间结果。
class Solution {
public:
string
LongToEnglish(unsigned long x) {
switch(x) {
case 0: return “Zero”;
case 1: return “One”;
case 2: return “Two”;
case 3: return “Three”;
case 4: return “Four”;
case 5: return “Five”;
case 6: return “Six”;
case 7: return “Seven”;
case 8: return “Eight”;
case 9: return “Nine”;
case 10: return “Ten”;
case 11: return “Eleven”;
case 12: return “Twelve”;
case 13: return “Thirteen”;
case 14: return “Fourteen”;
case 15: return “Fifteen”;
case 16: return “Sixteen”;
case 17: return “Seventeen”;
case 18: return “Eighteen”;
case 19: return “Nineteen”;
case 20: return “Twenty”;
case 30: return “Thirty”;
case 40: return “Forty”;
case 50: return “Fifty”;
case 60: return “Sixty”;
case 70: return “Seventy”;
case 80: return “Eighty”;
case 90: return “Ninety”;
case 100: return “One Hundred”;
case 1000: return “One Thousand”;
case 1000000: return “One Million”;
case 1000000000: return “One Billion”;
}
// less than 100
for (long i = 1; i <= 9; i ++) {
long j = i * 10;
if ((x >= j) && (x < j + 10)) {
long r = x - j;
return LongToEnglish(j) + (r > 0 ? (" " + LongToEnglish®): “”);
}
}
// less than 1000
for (long i = 1; i <= 9; i ++) {
long j = i * 100;
if ((x >= j) && (x < j + 100)) {
long r = x - j;
return LongToEnglish(i) + " Hundred" + (r > 0 ? (" " + LongToEnglish®): “”);
}
}
// less than 10000
for (long i = 1; i <= 9; i ++) {
long j = i * 1000;
if ((x >= j) && (x < j + 1000)) {
long r = x - j;
return LongToEnglish(i) + " Thousand" + (r > 0 ? (" " + LongToEnglish®): “”);
}
}
// Million
for (long i = 1; i <= 9; i ++) {
long j = i * 1000000;
if ((x >= j) && (x < j + 1000000)) {
long r = x - j;
return LongToEnglish(i) + " Million" + (r > 0 ? (" " + LongToEnglish®): “”);
}
}
// Billion
for (long i = 1; i <= 4; i ++) {
long j = i * 1000000000;
if ((x >= j) && (x < j + 1000000000)) {
long r = x - j;
return LongToEnglish(i) + " Billion" + (r > 0 ? (" " + LongToEnglish®): “”);
}
}
// Divide the number into 3-digit groups from left to right
string output = “”;
long cnt = 0;
while (x > 0) {
long y = x % 1000;
x /= 1000;
if (y > 0) { // skip middle-chunk zero
string t = “”;
if (cnt == 1) t = " Thousand ";
if (cnt == 2) t = " Million ";
if (cnt == 3) t = " Billion ";
output = LongToEnglish(y) + t + output;
}
cnt ++;
}
if (output[output.length() - 1] == ’ ')
{ // "Three Thousand " == > “Three Thousand”
return output.substr(0, output.length() - 1);
}
return (output);
}string numberToWords(int num) {
return LongToEnglish(num);
}
};
与其他语言(例如法语或德语)相比,英语计数更容易实现。由于 4 字节无符号整数最多可以容纳 2 32 -1 个数字,因此可以迭代每种可能性,按零的数量对它们进行分组。
带 API 的在线转换器
这个在线阿拉伯整数转英语工具使用 64 位有符号整数将整数范围从负 2^63-1 扩展到 2^63-1(即从 – 9223372036854775807到9223372036854775807)。
它还提供了一个易于使用(公平使用政策)的 API 来将阿拉伯数字(整数)转换为英语单词。这些数字被转换为目前英国和美国正在使用的短比例表示。即 10 亿等于 10^9(九个零)而 100 万等于 10^6(六个零)。