这道题和 PAT乙级1002 是基本一样的哦,可以多练习一下hh
小知识
- 字符转数字:
s - '0'
- 数字转字符:
to_string()
小步骤
- cin >> n; (注意这里应该用string类型,因为会爆int)
- 给n的每位数字求 和; 并转为字符串!
- 按照 和的每位字符 输出英文
闫老师优雅代码
#include<iostream>
using namespace std;
string word[11] ={"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
int main()
{
// 用string类型,因为会爆int
string n;
cin >> n;
// 给n的每位数字求 和
int sum = 0;
for (auto c : n) sum += c - '0'; // for (int i = 0; i < n.size(); i ++ )
// 按照 和的每位数字 输出英文
string str = to_string(sum); // "15"
cout << word[str[0] - '0'];
for (int i = 1; i < str.size(); i ++ ) cout << ' ' << word[str[i] - '0'];
return 0;
}
错误历程
刚开始写成了int n; cin >> n;
…后来发现数据范围 $0 ≤ N ≤ 10^{100}$ 会爆int啊!
所以得用字符串,然后字符和数字来回转转晕了,签到题写了两个小时,得,旅游去了是吗???
刚开始想的是:
- 12345 => 1+2+3+4+5= 15
- 15 => “15”
- “15”再存储成”1”,”5”
- 再对应英文数字输出…
之所以写的很费劲是因为一直在$SF$,看完视频才明白
应该写成word[str[i] - '0']
,而不是word[str[i]]
#include<iostream>
using namespace std;
const int N = 110;
int tmp[N];
int res[N];
string word[11]= {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
int main()
{
string s;
cin >> s;
//
int num = 0;
for (int i = 0; i < s.size(); i ++ ) num += s[i] - '0';
int i = 0;
for( ; num; i ++ )
{
res[i] = num % 10;
num /= 10;
}
i -- ;
cout << word[res[i]];
while(i > 0) cout << ' ' << word[res[-- i ]];
return 0;
}
第二次:看了视频之后发现可以不用存下来”1”,”5”,可以直接转成字符串然后遍历字符就行
所以这里用到了to_string()
来转成字符串,然后遍历字符的时候用到了word[str[i] - '0']
然后就是y总的代码啦!!!
新手学的比较笨!如果有错误欢迎您指出!
nice
哪里的视频啊?楼主
活动页面的PAT甲级辅导课~
好的,多谢