菜鸟记录: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'}; 。即有:


浙公网安备 33010602011771号