PAT乙级1002

/******************************

 

  写出这个数
   

 

题目:

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

格式要求:

 输入格式:

  每个测试输入包含 1 个测试用例,即给出自然数 n 的值。

  这里保证 n 小于 10^100

 输出格式:

  在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,

  但一行中最后一个拼音数字后没有空格。

程序调试举例:

 输入样例:1234567890987654321123456789

 输出样例:yi san wu

分析:

 数字储存 char str[100];

  n的范围为1~10^100,数字的个数为0~100。显然int等数据类型放

  不下这么大的数字,可以考虑将该数字以字符串的形式存放在字符

  数组中,数组的元素个数为100,数组首地址即为字符串首地址。

 数字读取 p=str;p++;

  通过将首地址赋值给指针,利用指针的自加来实现字符元素的读取。

 数字计算 转换ASCII值 sum+=*p-48;

  ‘0’=48,‘1’=49......'9'=57通过ASCII将字符转换为相对应的整数

 数字转换: 二维数组的赋值转换

  通过定义两个二维数组,A用来存放拼音数字,B用来存放加和后的拼音数字。

  根据数值的不同将相应的A字符赋值给B字符。

*******************************/

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     char str[100],*p;
 6    char A_number[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};    //多出来的第五个元素位用来读取与存放'\0'(字符串结束符)
 7    char C_number[3][5];
 8     
 9     int num=0,i,j,k,temp;    //k用来储存加和数的个数    temp用来储存中间变量,减少计算量
10     
11     scanf("%s",str);    //读取字符串
12     p=str;
13     
14     while(*p!='\0')    //数据加和
15     {
16         num+=*p-48;
17         p++;
18     }
19     
20     if(num>=100)    //判断num含数字的个数,n的范围为1~10^100,含有100个9时加和最大,最大为900
21     {
22         k=3;
23     }
24     
25     else if(num<10)
26     {
27         k=1;
28     }
29     
30     else
31     {
32         k=2;
33     }
34     
35     for(i=0;i<k;i++)
36     {
37         temp=num%10;
38                                             
39         for(j=0;A_number[temp][j]!='\0';j++)
40         {
41             C_number[i][j]=A_number[temp][j];
42         }
43                                             
44         C_number[i][j]='\0';    //手动赋值结束符
45         num/=10;
46     }
47     
48     for(i=k-1;i>=0;i--)
49     {
50         printf("%s",C_number[i]);
51         if(i!=0)    //最后一次不输出空格
52         {
53             printf(" ");
54         }
55     }
56     return 0;
57 }

 

/******************************
可以用string.h头文件进行字符串处理,更为简单。
*******************************/
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     char str[100],*p;
 7     char A_number[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
 8     char C_number[3][5];
 9     
10     int num=0,i,j,k;
11     
12     scanf("%s",str);
13     p=str;
14     
15     while(*p!='\0')
16     {
17         num+=*p-48;
18         p++;
19     }
20     
21     if(num>=100)
22     {
23         k=3;
24     }
25     
26     else if(num<10)
27     {
28         k=1;
29     }
30     
31     else
32     {
33         k=2;
34     }
35     
36     /*****************************************/
37     for(i=0;i<k;i++)
38     {
39         strcpy(C_number[i],A_number[num%10]);    //strcpy函数自动填补'\0',故不需要自行赋值结束符
40         num/=10;
41     }
42     /*****************************************/
43     
44     for(i=k-1;i>=0;i--)
45     {
46         printf("%s",C_number[i]);
47         if(i!=0)
48         {
49             printf(" ");
50         }
51     }
52     return 0;
53 }

 


/******************************
还可以忽略字符串赋值,直接输出

知识拓展:
 sprintf函数在stdio.h中,用法与printf相同
  前者是将目标打印到提前定义好的定义缓存区中,缓存区一般为字符串数组的形式,内容分转化为字符串储存,所以在初始化数组大小(n)的时候需要多定义一位(n+1)用来存放'\0'。
  后者是将目标打印到屏幕上。
  
  sprintf的函数返回值为字符串的长度,不包含'\0'。
  
 strlen函数在string.h中,用于计算字符串的长度
  长度不包含'\0'。
*******************************/
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     char str[100],*p;
 7     char A_number[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
 8     char buffer[4];    //定义缓存区 sun最大为3个数,第四个元素位储存结束符
 9     
10     int num=0,i;
11     
12     scanf("%s",str);
13     p=str;
14     
15     while(*p!='\0')
16     {
17         num+=*p-48;
18         p++;
19     }
20     
21     sprintf(buffer,"%d",num);    //将加和(整形,所以用%d)以字符串形式存放到buffer中
22     
23     for(i=0;i<strlen(buffer);i++)
24     {
25         printf("%s",A_number[buffer[i]-48]);    //通过buffer[i]-'\0'来定位加和数字对应的拼音数字,加以输出。
26         if(i!=strlen(buffer)-1)        //最后一次不输出空格
27         {
28             printf(" ");
29         }
30     }
31     return 0;
32 }
/*笔记仅供参考学习,如有转载,请标明原作者出处。*/

 

posted @ 2021-06-11 19:16  丨布谷丨  阅读(57)  评论(0)    收藏  举报