1002 写出这个数【PAT (Basic Level) Practice (中文)】
1.前言
-
分数:20
-
难度:⭐️⭐️⚝⚝⚝
-
知识点:
- C程序设计/数组/字符串
- C程序设计/分支控制/switch
-
方法技巧:
- 取得整数中的每一位数字:整数对10取余获得个位数字,然后整数除以10去掉个位数字,循环取得每一位数字。
-
运行限制
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
2.题目描述
读入一个正整数 n n n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n n n 的值。这里保证 n n n 小于 10100。
输出格式:
在一行内输出 n n n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
3.解题思路
3.1题目分析
输入的整数值远远超过int
的取值范围,应采用字符或字符串来处理输入的数字。
输入样例输入的整数 n n n 为1234567890987654321123456789。
各位数字求和1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 135
接下来,要用汉语拼音写出和的每一位数字。根据拼音的对应关系,0到9的拼音分别为ling, yi, er, san, si, wu, liu, qi, ba, jiu。
所以,135对应的拼音为输出样例中的yi san wu。
3.2基本思路
- 获取输入
n
中的每一位数字,再计算每一位数字之和sum
; - 取得
sum
的每一位数字,输出其对应的汉语拼音。
3.3详解步骤
- 循环读取
n
的每一位数字字符c
,转换为对应的数字c-'0'
,同时累加求各位数字之和sum
,也可以直接输入字符串n
,再计算各个数字之和; - 定义一个函数
printChinesePinyin
,用switch-case
将数字转换为对应的汉语拼音; - 将求和后的每位数字提取出来:整数对10取余获得个位数字,然后整数除以10去掉个位数字,循环取得整数的每一位数字;
- 调用上述函数,输出每位数字的汉语拼音。
3.4注意点
一行中最后一个拼音数字后没有空格,否则会格式错误。
4.参考答案
#include <stdio.h>
//输出数字对应的汉语拼音
void printChinesePinyin(int digit) {
switch(digit) {
case 0:printf("ling");break;
case 1:printf("yi");break;
case 2:printf("er");break;
case 3:printf("san");break;
case 4:printf("si");break;
case 5:printf("wu");break;
case 6:printf("liu");break;
case 7:printf("qi");break;
case 8:printf("ba");break;
case 9:printf("jiu");break;
}
}
//输出求和后的sum的每位数字
void output(int sum){
int i=0,flag=0;//flag标记是否输出空格
int digit[3];//记录求和后的每位数字
//从低位到高位取得sum的每一位数字记录在digit
while (sum) {
digit[i++] = sum % 10 ;
sum /= 10;
}
//输出数字
while(i>0){
if (flag) printf(" ");
else flag = 1;
printChinesePinyin(digit[--i]);
}
}
int main() {
int sum=0;
char c;
//循环读取n的每一位数字字符c,同时累加求各位数字之和sum,也可以读入字符串n,再计算各个数字之和
while((c=getchar())!='\n')
sum+=c-'0';
output(sum);//输出求和后的sum的每位数字
return 0;
}