(一)解题思路
①输入N(比较大,应该用字符串string存)
②计算N的各位数字之和S(把字符串的每一位抠出来,计算每位的和是多少)
③将S的每一位用英文单词表示(再把总和的每位抠出来,把它转化为相应的英文单词)
e.g. N=12345
=> S=1+2+3+4+5=15
=> one five
(二)在C++中如何把一个字符型的数字转化为它的数值本身?
a[i]-'0' 是把字符asc码映射成int数字本身(偏移量问题)
因为字符是用asc码存储的,
所以减去0的asc码就变成了从数字0开始的数值本身。
ASCII: '0' —— 48
'A' —— 65
'a' —— 97
e.g.求'7'的实际数值
ASCII:'7' —— 55
则实际数值 = '7' - '0'
= 55 - 48
=7
(三)注意输出时对空格的处理
for(auto c:str) //c++中可以利用auto进行遍历
cout << word[c - '0'] << ' ';
//这种情况写出来最后一个单词后边会多一个空格
所以需要用下述方式,对第一个单词特判,让其后的所有单词的空格在前边输出即可
cout << word[str[0] - '0'];//注意对结尾空格的处理
for(int i = 1 ; i < str.size(); i ++ )
cout << ' ' << word[str[i] - '0'];
e.g.法一的输出为:△_△_△_
法二的输出为:△_△_△
闫式优美题解
#include<iostream>
using namespace std;
int main()
{
string n;
cin >> n;//读入N
int s = 0;
for(auto c : n)//遍历每位数字
s += c - '0';//先把每个数的asc转化为数值本身,再计算每一位的总和
string str=to_string(s);
char word[10][10] = {
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine",
};//先用一个数组把每种情况写出来,就可以通过访问下标的形式访问到单词,完成对每种情况的判断(优点:代码短,不易出错,易于调试)
cout << word[str[0] - '0'];//注意对结尾空格的处理
for(int i = 1 ; i < str.size(); i ++ )
cout << ' ' << word[str[i] - '0'];
return 0;
}