[PAT B1002]写出这个数
题目描述
1002 写出这个数 (20 分)读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例
1234567890987654321123456789
输出样例
yi san wu
解析
- B组的简单题,主要是对字符串的处理,题目要求输入一行数字,计算出每一位数字之和,然后使用拼音输出这个数。
- 这里我的想法是使用a,b,c三个数,存放百位,十位,个位,然后写了一个函数out_put,用一个switch结构把一个十以内的数字转换成拼音输出,具体操作如下
#include<iostream>
#include<string>
using namespace std;
void out_put(int i) //out_put转换函数
{
switch (i)
{
case 0:cout << "ling"; break;
case 1:cout << "yi"; break;
case 2:cout << "er"; break;
case 3:cout << "san"; break;
case 4:cout << "si"; break;
case 5:cout << "wu"; break;
case 6:cout << "liu"; break;
case 7:cout << "qi"; break;
case 8:cout << "ba"; break;
default:cout << "jiu";
break;
}
}
int main()
{
int a, b, c, n = 0; //a,b,c计算百位,十位,个位的数字
string str;
cin >> str;
for (int i = 0; i < str.length(); i++) n += str[i] - '0';
a = n / 100;
b = n % 100 / 10;
c = n % 10;
if (a == 0 && b == 0 && c == 0)out_put(0); //如果这个数是0,那么输出0就行了
else if (a == 0 && b == 0) out_put(c); //如果这个数是一位数,那么输出个位数
else if (a == 0) { //如果是两位数,则分别输出十位和个位数
out_put(b);
cout << " ";
out_put(c);
}
else { //同理,不属于以上情况,按次序输出
out_put(a);
cout << " ";
out_put(b);
cout << " ";
out_put(c);
}
return 0;
}
- 这里我又又又又拜读了下柳神的代码,从中又学到了很多(所以说真的很推荐柳神的代码啊),我一开始也是不稀罕做乙级题,后面发现自己是不对的,因为乙级题虽然很简单,但是有很多的技巧是非常值得我们学习的,所以在AC完题目之后,仔细想想,或者看一下人家的代码,说不定会很有收获
- 这里柳神是采用了一个字符串数组存放了"ling"到“jiu”,这种思想早就用过了(这样的话我们就可以不用写out_put函数了),在这道题目中居然没想到,真的是可惜。其次我们在解题过程中最大的问题就是难以判断各位加起来的和究竟是多少位,因为它有可能是两位,有可能是三位,也可能是一位,然而柳神使用了string头文件中的to_string()函数,可以将一个数字转换为字符串,这样我们大量的if和else就没有使用的必要了,又大大简化了代码量。所以说to_string这样的工具函数就十分的有用,在以后的解题过程中要常常想到使用这样的方式。
- 下面贴柳神的代码,(仅供学习,侵删)
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int sum = 0;
string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi",
"ba", "jiu"};
for (int i = 0; i < s.length(); i++)
sum += (s[i] - '0');
string num = to_string(sum);
for (int i = 0; i < num.length(); i++) {
if (i != 0) cout << " ";
cout << str[num[i] - '0'];
}
return 0;
}