PAT 乙级 1002 写出这个数 (20 分)
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
解题思路:
问题的主要难在如何将得到的数字和转化为拼音,因此我们可以建立 map 映射将数字映射为对应拼音。可以使用语言自带的 map 类或者自己建立对应的映射。注意最后的答案需要逆序输出。
代码:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
string str;
cin >> str;
// 求和
int sum = 0, len = str.length();
for (int i = 0; i < len; i++) {
sum += str[i] - '0';
}
if (sum == 0) { // 特判 sum == 0 的情况
cout << "ling";
return 0;
}
// 建立 map 映射
map<int, string> mp = { {0, "ling"}, {1, "yi"}, {2, "er"}, {3, "san"}, {4, "si"},
{5, "wu"}, {6, "liu"}, {7, "qi"}, {8, "ba"}, {9, "jiu"} };
vector<string> vec; // string 类型的数组
while (sum) {
int temp = sum % 10;
vec.push_back(mp[temp]); // 插入到数组尾部
sum /= 10;
}
// 逆序输出
int i = vec.size();
while (i-- > 1)
cout << vec[i] << " ";
cout << vec[i]; // 题目卡格式输出
return 0;
}