pat刷题1002

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

输入格式:

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

输出格式:

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

输入样例:

1234567890987654321123456789
 
结尾无空行

输出样例:

yi san wu
 
结尾无空行
 
自己写的代码:
#include<stdio.h>
int main()
{
    int n[100]={0};

    int a=0; //各个数的和 
    int count=0;//记录数组的个数 
    int m,i,f,j=0;
    for(i=0;i<100;i++)   //循环输入数组数据
    {
        scanf("%d",&m);
        char c=getchar();//getchar函数,从键盘的缓冲区中得到一个字符常量并赋值给c
        n[i]=m;
        count++;
        if(c=='\n')   //当键盘输入回车时结束输入输入
        {
            break;
        }
        
    }
     for(i=0;i<count;i++)
     {
         printf("%d",n[i]);
     }
     

     
//     printf("\n");
     for(i=0;i<count;i++){
         a=a+n[i];
     } 
     
    printf("%d",a);
    printf("\n");
    
    int b=0;//记录a的倒置数 
    while(a>0){
        b=b*10+(a%10);
        a=a/10;
    }
    printf("%d",b);
    printf("\n");
    int sum=0;
    while(b>0){
        switch(b%10){
            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;
        }
          b=b/10;
        if(sum<b) printf(" ");
        
    }
    return 0;
    
}

错误的,主要是输入的问题,无法想题目一样读入123456789098765432123456789这么大的数,一开始用的是long long数据类型存储,但测试数据超过了最大值。然后用数组存储数值,但输入形式又不对,我写的代码需要在每个数字之间加空格才可以存储进数组中。

于是:去找了答案,如下:

#include <stdio.h>
#include <string.h>

int main() {
    const char pinyin[10][5] = {"ling", "yi", "er", "san", "si",
                            "wu", "liu", "qi", "ba", "jiu"};
    int num, sum = 0; 
    while(scanf("%1d", &num) != EOF)
        sum += num;
    char ans[4]; //给出的数 < 10^100,故各位数字之和最多为900  
    sprintf(ans, "%d", sum);
    for(int i = 0; i < strlen(ans); i++) {
        if(i != 0)
            printf(" ");
        printf("%s", pinyin[ans[i] - '0']);//‘0’-‘0’=0,0-‘0’=-48
    }
    return 0;
}

分析:

1. while(scanf("%1d", &num) != EOF)

在我们进行包括scanf等的输入函数使用时,其实用户在cmd中的输入实际是存放于缓冲区当中,当用户键入回车那一瞬间,之前输入的数据才会被存进去,而这里无论是单个字符还是字符串,我们都知道scanf的返回值呢是表示成功接受到的对象的个数,那这里如果遇到特殊情况,比如缓冲区文件流满等问题,那么scanf将如何处理呢?答案是返回-1 ! 这里不光是scanf,返回值为个数的函数,遇到文件流满大多都会返回-1,所以这个-1用的比较多,那么stdio.h就索性专门定义一个宏来表示,取End Of File(文件末尾的意思)的前三个字母即组成EOF,所以也就有了 #define EOF (-1) 这样的话!

 

2.头文件:#include <stdio.h>

sprintf()函数用于将格式化的数据写入字符串,其原型为:
    int sprintf(char *str, char * format [, argument, ...]);

【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。

 

3.

pinyin[ans[i] - '0']
我自己摆弄了一些发现
用%d输出的话
‘0’-‘0’=0,0-‘0’=-48,‘1’-‘0’=1,1-‘0’=-47


posted @ 2021-11-28 17:43  花生又叫二花深  阅读(107)  评论(0)    收藏  举报