1.题目介绍
2. 思路
这道题目较好理解,只是实现起来有几点要注意:
(1)正整数的范围。题目中规定n<10^100,这是个很大的数字。long long类型最大到2^63-1,也远小于这个数。但我最开始没有考虑这一点,用的long long。参考别人的代码时发现有用char型数组的,或者干脆直接用char进行循环读入的,最终我采用后者方式,感觉这样不会占用太多内存。
(2)将求和结果转为汉语拼音输出。这就需要对整形的求和结果进行单个数字的拆分。我开始想的是将数字转换为int数组。如果用除10取余的方式分隔每个数字,显然从低位向高位分隔比较容易,所以我转换的int数组是逆序的。这也不要紧,再逆序对应每个数字输出拼音就好了。我用这个方法实现了,是可以的,就是显得有点笨。
参考大佬代码时,发现string竟然有to_string()这个方法,这可太好了,果断用起,技能+1
(3)题目要求拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。我本能的反应就是除了末尾,每次输出一个拼音和一个空格。但这就需要判断哪里是末尾了。对字符串类型好说,用size()方法或length()方法就可以,但对数组来说并不好判断(怪我知道的太少55)。再次参考大佬代码,嗯,先输出空格再输出拼音就方便得多了,因为这样只需判断开头就可以了~
(3)最后一点就是,对字符类型的数字做运算时,一定要记得-'0'
3. 具体代码实现
#include <iostream>
#include <string> //c++的字符串类型要包括头文件
using namespace std;
int main() {
int count = 0;
char ch;
while((ch=getchar())!='\n') //循环读入每个数字
count+=ch-'0'; //读入的同时做求和运算
string piny[] = { "ling", "yi", "er", "san", "si", "wu", "liu","qi","ba","jiu"};
string num = to_string(count); //将求和结果转变为字符串类型
for (int i = 0; i < num.size(); i++) { //字符串类型可以用size()和length()方法求长度
if(i != 0) cout << " "; //保证拼音数字间有1空格,但最后一个拼音数字后没有空格
cout << piny[num[i] - '0'];
}
return 0;
}
4.收获
(1)数字很大并且不需要对整体进行运算时,可以考虑字符或字符数组的方式进行读入或存储
(2)to_string()方法可以将int转换为string类型
(3)发现c++的string类型可以通过下标获取元素,java好像不可以..(要记住)