山河永寂,人间长情

0%

PAT (Advanced Level)-1005. Spell It Right (20)

PAT (Advanced Level)-1005. Spell It Right

1005. Spell It Right (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue


Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English.


Input Specification:

Each input file contains one test case. Each case occupies one line which contains an N (<= 10100).

Output Specification:

For each test case, output in one line the digits of the sum in English words. There must be one space between two consecutive words, but no extra space at the end of a line.

Sample Input:
12345
Sample Output:
one five


解读

这道题目要求我们从输入的一串数字中对每个数字进行加和,这就要明确一点:
这样的一串数字累加定然和int型操作不一样。
我们首先需要能将这一串数字逐位进行拆分并单独操作。
故而我们有char字符数组和string类型可以实现这样的功能。

但是我们在这个问题中需要处理的一点就是:字符型的0123456789和作为数值的0123456798是有区别的,两者需要依照ASCII码制进行转化,比如字符型的’1’要变为1就需要进行如下的操作

1
'1'-'0'

两者的ASCII码制的差值,即为字面数字值。

还有一个需要注意的问题就是,int和char数组和string的互换需要熟记
sstream流的功能

完整代码

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
#include<iostream>
#include<cstring> //注意PAT用的C++环境为linux下的g++,string为C语言中的string.h头文件,与C++的string头文件有区别。C++中使用cstring
#include<sstream>

using namespace std;

char spell[10][10] = { "zero","one","two","three","four","five","six","seven","eight","nine" };

int main()
{
char inputnum[101];//10的100次方,一共是101位数,切记
cin >> inputnum;

int sum_temp = 0;//记载数目总和
int len = 0;//记载长度

len = strlen(inputnum);
for (int i = 0; i < len; i++)
sum_temp += (inputnum[i] - '0');//转化为int数据进行累加

//int转string的方法
string resultNum;
stringstream ss;
ss << sum_temp;
ss >> resultNum;

//输出string
len = resultNum.length();

for (int i = 0; i < len; i++)
{
cout << spell[((int)resultNum[i] - '0')];
//让我们注意一下这里spell为存储英文的数组,
//(int)resultNum[i]是强制将string中的字符转化为int
//(这里的int转化后是ASCII中对应的码制)与字符'0'相减才能得到字面的int数值

if (i < len - 1)//最后的末尾不加空格
{
cout << " ";
}
}

return 0;
}