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 }
/*笔记仅供参考学习,如有转载,请标明原作者出处。*/

浙公网安备 33010602011771号