PATPAT乙级

1002 写出这个数

2019-04-12  本文已影响0人  Gvence

题目来源

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

输入格式:

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

输出格式:

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

输入样例:

1234567890987654321123456789

输入样例:

yi san wu

题目解析:

难点1:

题目要求输入一串正整数,而这串正整数比较大,最高可达10^{100},这个数值远超int 和long int的存储上限,一个8字节的long int 的范围约在(-10^{18 }~10^{18})之间,所以不能直接用:

long int n;
scanf("%d", &n);

这里我的思路是,创建一盒长度为100的字符数组:

char n[100];

每个元素存一个数字的字符量,然后再用字符量的ASCII值减去0字符的ASCII值得到整形值,如下:

sum += n[i] - '0';//获取整形值

难点2:

为了最后能输出0 ~ 9数字的拼写:ling ~ jiu。我们需要一个字符串表,用来查找这些拼写,这里有两种方法:
方法1,创建一个二维字符数组:

const char dic[10][] = {"ling","yi","er",\ //这是一个换行符
"san","si","wu","liu","qi","ba","jiu"}

方法2,创建一个一维字符指针数组,数组的每一个元素都是一个字符指针,指向我们定义的拼写字符的地址:

const char *dic[] = {"ling","yi",\ //这是一个换行符
"er","san","si","wu","liu","qi","ba","jiu"};

之所以用了const,是因为我这里的元素都是常量,不希望被修改。

完整代码:

#include <stdio.h>

int main(){
    char n[100];
    const char *p[3];//定义一个指针,用来指向要输出的拼写的地址,
                      //为什么是3个,这里可以思考一下下
    int index,i;
    const char *dic[] = {"ling","yi",\ //换行符
"er","san","si","wu","liu","qi","ba","jiu"};
    int sum = 0,j = 0;
    scanf("%s", n);//字符化读入
        
    for (i = 0; n[i] != '\0'; i++){
        sum += n[i] - '0';
    }//遍历求和

    if (sum == 0){
        index = 0;
        printf("%s", dic[index]);
    }else{
    while(sum>0){
        index = sum%10;
        sum /= 10;
        p[j] = dic[index];
        j++;
    }//遍历sum,使指针指向字母拼写的地址

    while(j>0){
        j -- ;
        printf("%s", p[j]);
        if (j != 0){
            printf(" ");
        } 
    }//遍历指针输出字母拼写
}
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读