//PAT刷题第二题

//题目:

1002 写出这个数

分数 20

全屏浏览题目

切换布局

作者 CHEN, Yue

单位 浙江大学

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

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。

输出格式:

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

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

过程:起初以为只要不断去个位就好,但是测试用例长度超出long long;

SWAP1:

#include <stdio.h>
int main()
{
    long long input = 0;
    scanf("%ld", &input);
    long long yu = 0;
    long long sum = 0;//初始化
    while (input != 0)
    {
        yu = input % 10;
        input = input / 10;
        sum = sum + yu;//削掉个位
    }
    printf("%ld", sum);
    return 0;

过程:为避免长度问题,改用getchar;

SWAP2:

1

#include <stdio.h>

int main()
{
    int sum = 0;
    int i = 0;
    //初始化
    while (getchar() != '\n')//判定
    {
        sum = sum + getchar()-'0';//加和
    }// 问题:在使用getchar判定的时候没有意识到判定时已经读取了一个字符;
    //结果:1、输入为奇数位,第二个getchar()吃掉'\n',导致需要再次输入;
    //      2、输入为偶数,但判定时已经读取一个字符,设数abcdefgh,结果只会是
            //b+d+f   
    printf("%d", sum);
    return 0;
}

2为避免上述问题,尝试将getchar()放进数组,由数组元素进行判定,由getchar()进行

读取

#include <stdio.h>

 int main()
{
    int sum = 0;
    int count = 0;

    char arr[1000] = {'0'};
    //初始化
    
    int i = 0;
    do
    {   arr[i] = getchar();
        i = i + 1;//存放数组
    } while (arr[i-1] != '\n');//用数组判定
arr[i-1]='0';    

for (int j = 0; j <= i-2; j++)
    {
        sum = sum + (arr[j] - '0');//循环加和
    }
    printf("%d", sum);
    return 0;

}

3认为用数组存放而后判定较为麻烦,在同学建议下改用scanf

#include <stdio.h>

int main()
{
    char input = '0';
    scanf("%c", &input);
    int sum = 0;
    while (input != '\n')
    {
        sum = sum + input-'0';
        scanf("%c", &input);
    }
    printf("%d", sum);
    return 0;
}

自此数据的转化完成

接下来是拼音的实现

最初打算采用switch,先将各个位的数字放入数组,再用for循环

逆序

SWAP1:

int main()
{
    int arr[101] = { 0 };
    int a = 0;
    scanf("%d", &a);
    int i = 0;
    while (a != 0)
    {
        arr[i] = a % 10;
        a = a / 10;
        i++;
    }
    for (i = i - 1; i >= 0; i--)
    {
        switch (arr[i])
        {
        case 1:
        {
            printf("yi");
            if (i != 0)
                printf(" ");
            break;
        }
        case 2:
        {
            printf("er");
            if (i != 0)
                printf(" ");
            break;
        }
        case 3:
        {
            printf("san");
            if (i != 0)
                printf(" ");
            break;
        }
        case 4:
        {
            printf("si");
            if (i != 0)
                printf(" ");
            break;
        }
        case 5:
        {
            printf("wu");
            if (i != 0)
                printf(" ");
            break;
        }
        case 6:
        {
            printf("liu");
            if (i != 0)
                printf(" ");
            break;
        }
        case 7:
        {
            printf("qi");
            if (i != 0)
                printf(" ");
            break;
        }
        case 8:
        {
            printf("ba");
            if (i != 0)
                printf(" ");
            break;
        }
        case 9:
        {
            printf("jiu");
            if (i != 0)
                printf(" ");
            break;
        }
        case 10:
        {
            printf("shi");
            if (i != 0)
                printf(" ");
            break;
        }
        default:break;
        }
    }
    return 0;
}

因过于长而舍弃;

后尝试把拼音放进数组:

SWAP2

int main()
{
    char input = '0';
    scanf("%c", &input);
    int sum = 0;
    int ge = 0;
    int arr[10] = { 0 };
    int i = 0;//初始化
    while (input != '\n')
    {
        sum = sum + input - '0';
        scanf("%c", &input);//各位加和
    }
    //printf("%d", sum);
    while (sum != 0)
    {
        arr[i] = sum % 10;//对加出来的sum取出各个位
        i++;
        sum = sum / 10;
    }
    const char* list[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };//把拼音存放到数组里
    for (int j = i-1 ; j >= 0; j--)
    {
        printf("%s", list[arr[j]]);//取代switch
        if (j > 0)
            printf(" ");
    }
    return 0;
}

PTA第二题结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值