题目要求
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
复制代码
输出样例:
yi san wu
复制代码
算法 1
分析
1. 用string接收输入,string中每一位数字累加得到sum
2. 用 sum%10,sum/10循环,得到sum的每一位数并存在数组a[ ]中
3. 倒叙输出(把数字和之前的空格看作一个整体)
C++
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string s;
cin >> s;
int sum = 0;
//求和
//当成字符类型读入,转换成数字类型要减去0的ASCii码
for(int i = 0; i < s.length(); i++)
{
sum += s[i] - '0';
}
int a[10];
int t = 0;
//利用a[]存储sum从低到高各位数字
while(sum)
{
a[t] = sum % 10;
sum /= 10;
t++;
}
//输出是从高位到低位,索引从t-1开始而不是t
cout << str[a[t-1]];
for(int i = t-2; i >= 0; i--)
{
cout << " " << str[a[i]];
}
return 0;
}
复制代码
算法 2
分析
1. 用string接受输入,string中的每一位相加求和得到sum (int类型)
2. 将int类型转换成string类型
3. 从高位到低位输出每一位对应的中文拼音
C++
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string s;
cin >> s;
int sum = 0;
//求和
//当成字符类型读入,转换成数字类型要减去0的ASCii码
for(int i = 0; i < s.length(); i++)
{
sum += s[i] - '0';
}
string s2;
stringstream ss;
ss << sum;
ss >> s2;
for(int i = 0; i < s2.length(); i++)
{
if(i != 0) cout << " ";
cout << str[s2[i]- '0'];
}
return 0;
}
复制代码
注意点
如果是字符类型的,在数组或者求和当作普通数字使用的要和0的ASCII码相减**。**
stringstream类
头文件:
<sstream>
复制代码
(1). 将int类型转化成string类型
int num;
stringstream ss;
string str;
ss << num;
ss >> str; //将int转为string类型
复制代码
(2). 将string类型转换成int类型
string str = "17";
stringstream ss;
int num;
ss << str;
ss >> num; //将string类型转为int类型
cout << ++num; //num = 18
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END