PAT乙 1002.写出这个数

题目

读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。

输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:
1234567890987654321123456789
输出样例:
yi san wu

思路

我的思路很简单,把数字当成字符串输入进去,然后用sum依次把每一位加起来。之后再处理得到的结果sum,用整除的形式依次得到各个位,最后再输出。然而,一开始写了之后,发现总是遇到“格式错误”的问题。下面将出错点写于下面的代码注释中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

#include <iostream>
using namespace std;

string transform(int num){
string word;
if(num == 0){
word = "ling";
}
if(num == 1){
word = "yi";
}
if(num == 2){
word = "er";
}
if(num == 3){
word = "san";
}
if(num == 4){
word = "si";
}
if(num == 5){
word = "wu";
}
if(num == 6){
word = "liu";
}
if(num == 7){
word = "qi";
}
if(num == 8){
word = "ba";
}
if(num == 9){
word = "jiu";
}
return word;
}

int main(){
string n;
while(cin>>n){
//cin >> n;
int sum = 0;
for(int i=0; i<n.length(); i++){
sum += n[i] - '0';
}
string result;
int cnt = 0;
while(sum/10 != 0){
cnt ++;
int ex = sum % 10;
sum = sum / 10;
if(cnt == 1){
result = transform(ex);
}
else{
result = transform(ex) + " " + result;
}
}
if(cnt==0) //一开始的代码少了这一句的判断,即输入的字符串各个位相加后,sum为个位数,那么就无法进入上面的while循环,导致其结果后多了一个空格。
result = transform(sum);
else
result = transform(sum) + " " + result;

cout << result <<endl;
}
}

在发现原因后,也顺利解决了,但其实我的做法很不简洁,特别是transform这个函数。二水马写了一个简洁写法给我,直接粘贴,学习。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#include <iostream>
#include <vector>
using namespace std;

string transform(int num){
vector<string> name ={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string res = name[num%10];
while(num/10 > 0){
num /= 10;
res = name[num%10] + " " + res;
}
return res;
}

int main(){
string n;
cin >> n;
int sum = 0;
for(int i=0; i<n.length(); i++){
sum += n[i] - '0';
}
cout << transform(sum);
}

(由于代码是直接复制粘贴,因此缩进有点问题,无碍)