- 题目
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
- 个人理解
好久不做题脑子锈了,这题一眼看过去感觉简简单单switch语句搞定,细看发现Input范围吓人,开始想用double储存然后fmod函数处理最后对sum做一个int类型的强转,但不知道为什么结果总是差2,考虑到GCC编译器的强转判定经常出现匪夷所思的错误没有深究(有懂的大佬还请指教qwq),改用字符串读取,操作简单很多。后面逆序输出没有想到太好的办法,用了一个很蠢的递归,想过先循环判断sum的长度然后倒序遍历,感觉也不太好,希望有佬指点qwq
另外这个代码没有AC,测试点1出现类型错误,调了半天也不懂哪错了。。。希望大佬指点🤣
代码如下
#include <stdio.h>
#include <string.h>
char number[10][10] = {
{"ling"},
{"yi"},
{"er"},
{"san"},
{"si"},
{"wu"},
{"liu"},
{"qi"},
{"ba"},
{"jiu"}
};
void myprint(int n, int mark){
if(n < 10){
if(n == mark){
printf("%s\n", number[n]);
}else{
printf("%s ", number[n]);
}
}else{
myprint(n/10, mark);
if((n % 10) == mark){
printf("%s\n", number[n % 10]);
}else{
printf("%s ", number[n % 10]);
}
}
}
int main(void){
char n[102];
scanf("%s", n);
int sum = 0;
for(int i = 0; i < strlen(n); i++){
sum += n[i] - '1' + 1;
}
int mark = sum % 10;
myprint(sum, mark);
return 0;
}
- 补充:
看了其他人的题解改正了,空格完全没必要单独用一个mark判断,只需要把第一个拎出来"%s"剩下" %s"就行了,长见识了!这个方法刷PAT的很多题感觉都能用到(PAT是真的不想让你输出末尾多余的空格🤣
下面是AC代码
#include <stdio.h>
#include <string.h>
char number[10][10] = {
{"ling"},
{"yi"},
{"er"},
{"san"},
{"si"},
{"wu"},
{"liu"},
{"qi"},
{"ba"},
{"jiu"}
};
void myprint(int n){
if(n < 10){
printf("%s", number[n]);
}else{
myprint(n/10);
printf(" %s", number[n % 10]);
}
}
int main(void){
char n[102];
scanf("%s", n);
int sum = 0;
for(int i = 0; i < strlen(n); i++){
sum += n[i] - '1' + 1;
}
myprint(sum);
return 0;
}