PAT Basic Level(乙级)1002.写出这个数

解题思路:

根据题目可知,数字最大为 1 0 100 1 10^{100}-1 ,即最多有100位,那么数字之和最大为999,三位数足够表示。另外要注意判断输出首位的方法。剩下的问题就是存储各位数字已经逐个求和并用汉字输出。

可以用一个长度为100的数组储存,也可以直接用向量vecotr或者string,后者可以不用考虑长度的问题而且也有现成的函数返回其长度,可能编写代码相对简单,本次没有选择偷懒的办法,使用了数组来表示。

为了读取各位数字,以字符形式用getchar()每次读取一个字符,这里正常会想到用char数组,不过考虑到while循环读取时结束的文件尾条件,最后选择用int数组来实现(EOF= 1 -1 而char的一般实现都是无符号)。注意代码中输出时的while循环,因为求和时最终从while循环出来的时候 i 比实际最后一个有效位大1,所以需要使用前减1。

源代码如下:

#include <stdio.h>

char word[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};  
int main()
{
    int num[100];   //存储各位数字
    int count=0;   //统计数字位数
    int sum=0;   //各位数字之和
    while((num[count++]=getchar())!=EOF&&num[count-1]!='\n')  //以ascii字符格式循环读取数据
    ;

    for(int i=0;i<count-1;++i)  //对数字求和
        sum+=num[i]-48;
    int digit[3]={0,0,0};  
    int i=0;
    while(sum){
        digit[i++]=sum%10;  //逆序存储,输出时反序输出
        sum/=10;    
    }
    while(i--){   //因为本身上一个while出来后i就比最后一位有效值大1
        printf("%s",word[digit[i]]);     
        if(i) printf(" ");  //输出空格
    }
    return 0;
}

发布了11 篇原创文章 · 获赞 1 · 访问量 83

猜你喜欢

转载自blog.csdn.net/weixin_44452361/article/details/104582889