PAT乙级P1002题解

  • 题目

读入一个正整数 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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值