菜鸟记录:c语言实现PAT乙级1002--写出这个数

平平无奇的一道题,结尾总结一下学到的数组新知识吧。

题目:

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

输入格式:

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

输出格式:

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

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

题目分析:

非常简单易懂的一题,很轻易的联想到用字符串来取得输入值,通过累加得到int型的数字结果,通过取余的操作来分成相应的字符。注意到数字的大小小于10e100,即输入的字符串不超过100个字符,可以轻易得到最终结果最大为100个9,即900,用int和大小为3的数组即可。

<-----------------------------------完整代码----------------------------------->

 1 #include<stdio.h>
 2 char s[100];//输入数组
 3 int sum;
 4 int main() {
 5     int len=0;
 6     int a;
 7     char *r[] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};//拼音数组
 8     scanf("%s", &s);
 9     for (int i = 0; s[i]; i++) {
10         sum += ((int)s[i] - 48);
11     }//计算数据的int型结果
12  
13     if (!sum)
14         printf("%c", r[0]);//结果不为0则直接输出“ling”
15     else {
16         for (int i = 0; sum; i++) {
17             s[i] = sum % 10;
18             sum /= 10;
19             len++;            //取余计算,同时计算结果长度
20         }
21     }
22     for (int i = len-1; i >0; i--)
23     {
24         printf("%s ", r[s[i]]);//倒叙输出对应拼音
25     }
26     printf("%s", r[s[0]]);//规范输出,使最后一位没有多余的空格输出(不然认为不规范扣分)
27     return 0;
28 }

 

关于数组:

在初始化拼音数组时,遇到个小问题,如果是这样写:

char r1[3] = { 'abc','qwe'};

则会报错,明显abc不是字符型,不适于char型。而替换成指针时:

char *r2[] = {"abc","qwe"};

在只读区电脑则认为是 {'a', 'b', 'c', '\0'},此时读取可以直接得到abc,这里也要说明,在输出时,如果采用printf("r2:%s\n", r2),那么由于计算机采用小段存储,出栈的时候则会输出成“cba”,因此应为printf("r2:%s\n", r2[0])。接下来联想到二维数组,即:

char r3[][3] = { "abc","qwe" };

此时输出r3[0],结果为 abcqwe,与上面相似,我们可以看成 r3[0] = {'a', 'b', 'c'}; // 无终止符,r2[1] = {'q', 'w', 'e', '\0'}; // 正确添加终止符。所以改成

char r3[][4] = { "abc","qwe" };

就可以看成r3[0] = {'a', 'b', 'c', '\0'}; // 无终止符,r2[1] = {'q', 'w', 'e', '\0'}; 。即有:

 

posted @ 2025-02-23 19:27  000100110111  阅读(21)  评论(0)    收藏  举报