C语言——PAT 乙级(1002.读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。)

题目:

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^​100​​。

输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:
1234567890987654321123456789
输出样例:
yi san wu

我的思路: 

        如果不考虑数据溢出和拼音输出,就例如输入12345,输出15。假设sum是我要求的值,那么这个题目其实就是让输入值每次模10给sum,然后输入值每次再除以10就能够解决。

        那么现在把数据溢出考虑上的话,我们可以把输入的数存放到数组char arr[1000]中,这样,只要输入值n 小于 10^​100​​,数据就不会溢出。这个时候上面模10除10的方法不适用了,但不难看出,只要把数组arr中的每个字符都减掉48再依次相加就可以得出要求的sum了。

        这个时候再考虑将sum的值依次输出。当我们用while循环模10除10依次输出时,结果会是倒置的数,比如我输入12345,sum的值是15,但是while循环给出的值是5 1。这个时候我想到了用递归进行输出,出口是n<=9,对n的操作是n每次除10,然后我们在下面加上输出函数每次输出一个数字和一个空格。又因为题目要求最后不能有空格,那我向递归函数中再传一次n的值并用i保留,当n、i值相同时,说明就是原来最开始的数,那我输出时就不用加空格。

        最后在考虑拼音的问题,这个时候我们只需要在原本的输出函数上加上switch语句把每个数字改成拼音即可。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int xiechuzhegeshu(char* arr)
{
    int n = 0, i = 0;
    while (arr[i]!='\0')
    {
        n += arr[i] - 48;
        i++;
    }
    return n;
}

char pinyin(int n,int flag)
{
    switch (n)
    {
        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;
        case 0:
            printf("ling");
        default:
            break;
    }
    if(flag==0) printf(" ");
}

void change(int n,int i)
{
    if (n > 9) change(n / 10,i);
    if (n != i)pinyin(n % 10, 0);
    if (n == i)pinyin(n % 10, 1);
}

int main()
{
    int i=0;
    char arr[1000] = { 0 };
    gets(arr);
    int n = xiechuzhegeshu(arr);
    change(n,n);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值