PAT 1002. 写出这个数
PAT 1002. 写出这个数 (20)
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。
输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
错误一:
sum=sum+s[i]-'0'
忘记变量s是字符型,字符型数字转化成数值应该减去'0'
错误二:
char c[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
混淆字符数组和字符串数组
字符数组:
char a[15]={'I',' ','l','o','v','e',' ','y','o','u',' '};
若printf("%c\n",a[9]); ---------------------------则结果为u
char g[]={'I',' ','l','o','v','e',' ','y','o','u',' '};
若printf("%c\n",g[9]); ---------------------------则结果为u
字符串数组;
char b[15]="i love you";
若printf("%s\n",b);-------------------------------则结果为i love you
printf("%c\n",b[5]);------------------------------则结果为e
char d[15]={"i love you"};
printf("%s\n",d);-------------------------------则结果为i love you
printf("%c\n",d[5]);------------------------------则结果为
b就是一个纯字符类型,不能用%s对其输入赋值,也不能用%s对其输出,否则将会出现错误,只能用%c对其输出; b和d虽然表达形式不同,但都是字符串类型,不不仅可以用%s和%c他俩赋值,还可以用%s和%c输出。
char f[]="i love you";
printf("%s\n",f);
printf("%c\n",f[5]);
char h[]={"i love you"};
printf("%s\n",h);
printf("%c\n",h[5]);
若定义char e[9] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};则错误。因为e[9]表示数组e最多有9个字符,而对数组e的初始化远超过了9个字符,而根据题意最后应该根据数组的下标将一个个的字符串输出而不是一个个字符。又因为二维数组是由多个一维数组构成,因此将e改成二维数组,二维数组每一行存放一个字符串(在二维数组中,行可以不写,列不能不写 )。改为char e[][9] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
拓展延伸:
int a;
double b;
char c;
char d[4] = {'L','o','v','e'};
char e[] = {"LOVE"};
sizeof(a); //a为整型,一个整形变量占用4个字节空间,sizeof函数返回值为4;
sizeof(b); //b为double型,一个整形变量占用8个字节空间,函数返回值也为8;
sizeof(c); //c为字符型,一个字符占用1个字符空间,函数返回值为1
sizeof(d); //字符数组d一共占用4*1个字符空间,函数返回值为4;
sizeof(e); //字符串数组e一共占用5*1个字符空间,函数返回值为5;
字符串数组,编译器会为每个字符串末尾赋值一个字符串结束标志–>‘\0’,所以在对字符串数组初始化时,我们必须预先为结束标志腾出一个字符空间。
字符数组,系统并不分配结束字符 。
char a[]={"LOVE"};
sizeof(a); //字符串a内一共有5个字符,但是有效字符是‘\0’之前的,也就是LOVE;所以函数返回值为4;
/*字符串数组中结束标识符'\0'的作用*/
char b[]={"LOVE\0LOVE"}; //b所指向的字符串确实是:LOVE\0LOVE\0
strlen(b); // strlen()在对字符串b进行扫描的时候,直到遇到结束标识符'\0'之前都是有效字符,之后的全部无效;所以strlen返回值为4;
sizeof(b); //对于字符串b来说所指向的字符串是完整的LOVE\0LOVE\0,占用的空间也是10*1==10;所以返回值为10;
#include<stdio.h>
#include<string.h>
int main (void){
char s[1000];
scanf("%s",s);
int n=strlen(s);
int sum=0,i=0;
while(n--){
sum=sum+s[i]-'0';
i++;
}
int a[1000];
i=0;
while(sum){
a[i]=sum%10;
sum=sum/10;
i++;
}
char c[][9] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
i--;
printf("%s",c[a[i]]);
while(i--){
printf(" %s",c[a[i]]);
}
}