PAT Basic 1002. 写出这个数

PAT Basic 1002. 写出这个数

1. 题目描述:

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

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

1234567890987654321123456789

5. 输出样例:

yi san wu

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

首先这里保证输入n小于\(10^{100}\),对于数值类型来说是很大的,所以需要作为字符串读入。

然后就是对读入的字符串逐字符进行处理就好,比较直接的思路。

最后为了输出数字的拼音,定义了一个char指针数组指向各数字拼音的字面量,避免了直接定义二维数组的存储空间浪费。

My Code:

#include <stdio.h>

int main(void)
{
    char * pinyin[] = {"ling", "yi", "er", "san",
                      "si", "wu", "liu", "qi",
                      "ba", "jiu"};
    
    char n[100]; // 这里好像应该定义101的,但100也accepted了。由n的上限可推得n最多有100位数字, 
    int sum = 0; // 但注意字符串还要存储末尾的空字符(null character)
    char * pchar;
    int result[4]; // 这里其实最多3个元素,因为假设n的100位全为9,其各位数字之和的最大值为900
    unsigned char count = 0;
    
    scanf("%s", n);
    
    pchar = n;
    while(*pchar != '\0') // 这里可以直接写while(*pchar),空字符的ascii码为0
    {
        sum += *pchar - '0';
        pchar++;
    }
    
    while(sum) // 这里计算总和的各位数字
    {
        result[count] = sum % 10;
        sum /= 10;
        count++;
    }
    
    while(count > 1)
    {
        printf("%s ", pinyin[result[count-1]]);
        count--;
    }
    
    printf("%s\n", pinyin[result[0]]);
    
    return 0;
}
posted @ 2023-02-21 20:42  十豆加日月  阅读(17)  评论(0编辑  收藏  举报