题目描述:
本道题难度是较难,但属于处理起来比较复杂的那种,题意很好理解,也不难做,其实就是简单的字符串拼接而已。
题目要求每三位数字放一块进行处理,那就num%1000 作为一个小块进行处理就完事了。
需要注意的点
1. 每三位处理一次,三位处理完后根据取余次数,如果(num/1000!=0),就给字符串前面加 thousan、million,以及其他更高的等级。
2.三位一处理,如果百位不为0,那就给字符串加一个“ hundred and ”,然后把百位数字加在前面。
3.特殊化处理,我特殊化处理了1-19这些数字,以及每三位取余后,十位为0的情况以及个位为0的情况,这些小点都决定了输出格式,有时候多一个空格少一个空格的很麻烦,也很讨厌
来看代码
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, string> M1; // 个位 1-19
map<int, string> M2; //十位
map<int, string> M3; //百 千 万
M1 = {{1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}, {5, "five"}, {6, "six"}, {7, "seven"}, {8, "eight"}, {9, "nine"}, {10, "ten"}, {11, "eleven"}, {12, "twelve"}, {13, "thirteen"}, {14, "fourteen"}, {15, "fifteen"}, {16, "sixteen"}, {17, "seventeen"}, {18, "eighteen"}, {19, "nineteen"}};
M2 = {{2, "twenty"}, {3, "thirty"}, {4, "forty"}, {5, "fifty"}, {6, "sixty"}, {7, "seventy"}, {8, "eighty"}, {9, "ninety"}};
M3 = {{1, "thousand"}, {2, "million"}};
long long num;
long long temp = 0;
int flag = 0;
//记录是几个三位合并 然后拼接 hundred thousand million
string str = "";
cin >> num;
while (num)
{
temp = num % 1000;
num /= 1000;
flag++;
if ((temp / 10) % 10 <= 1)
{ //最后两位是1-19
str = M1[temp % 100] + " " + str;
}
else
{
if (((temp / 10) % 10) && (temp % 10))
//个位和十位均不为0
str = M2[(temp / 10) % 10] + " " + M1[temp % 10] + " " + str;
if ((temp % 10) == 0) //个位为0
{
str = M2[(temp / 10) % 10] + " " + str;
}
}
if ((temp / 100) != 0)
{
if (temp % 100)
str = M1[temp / 100] + " hundred" + " and " + str;
else
str = M1[temp / 100] + " hundred" + str;
}
if (num != 0)
{
str = M3[flag] + " " + str;
}
}
cout << str << endl;
}
由于是需要特殊化处理数字,所以采用了map来进行键值对的匹配。方便使用。
所以大概就这个样子。
这道题写的很开心!