将非负整数转换为其英文单词表示。给定的输入保证小于 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(六个零)。
|