题目:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
解题思路:
把输入的数当作字符串类型 ,每位依次相加(此时要 n.at(i)-‘0’,不然得到的就是assii码值),再把结果当成字符串类型,通过一个函数输出拼音。
出错:
1.刚开始没考虑到输入的数太长了,int型存不了,就用int型来读取,再转化成string型计算,结果一直答案错误,其实可以直接用string类型读取,这样也解决了数字太长,int和long型都存不下的问题
2.n.at(i)-‘0'
3.warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for( int i=0;i<n.size();i++){
i是signed类型,n.size()是unsigned类型,在int前面加上unsigned即可
代码:
#include <iostream> // std::cout
#include <string> // std::string, std::to_string
#include <sstream>
using namespace std;
void sum(string);
string pinyin(char);
int main(){
string n;
cin>>n;
sum(n);
return 0;
}
void sum(string n){
int sumn = 0;
for( int i=0;i<n.size();i++){
sumn += n.at(i)-'0';
}
std::stringstream stream1;
stream1<<sumn;
string sumns = stream1.str();
for(int i=0;i<sumns.size();i++){
if(i!=sumns.length()-1){
cout<<pinyin(sumns.at(i))<<" ";
}else{
cout<<pinyin(sumns.at(i));
}
}
}
string pinyin(char n){
switch(n){
case '0':return "ling";
case '1':return "yi";
case '2':return "er";
case '3':return "san";
case '4':return "si";
case '5':return "wu";
case '6':return "liu";
case '7':return "qi";
case '8':return "ba";
case '9':return "jiu";
default: return "error";
}
}