pat刷题1002
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
#include<stdio.h> int main() { int n[100]={0}; int a=0; //各个数的和 int count=0;//记录数组的个数 int m,i,f,j=0; for(i=0;i<100;i++) //循环输入数组数据 { scanf("%d",&m); char c=getchar();//getchar函数,从键盘的缓冲区中得到一个字符常量并赋值给c n[i]=m; count++; if(c=='\n') //当键盘输入回车时结束输入输入 { break; } } for(i=0;i<count;i++) { printf("%d",n[i]); } // printf("\n"); for(i=0;i<count;i++){ a=a+n[i]; } printf("%d",a); printf("\n"); int b=0;//记录a的倒置数 while(a>0){ b=b*10+(a%10); a=a/10; } printf("%d",b); printf("\n"); int sum=0; while(b>0){ switch(b%10){ case 0:printf("ling");break; case 1:printf("yi");break; case 2:printf("er");break; case 3:printf("san");break; case 4:printf("si");break; case 5:printf("wu");break; case 6:printf("liu");break; case 7:printf("qi");break; case 8:printf("ba");break; case 9:printf("jiu");break; } b=b/10; if(sum<b) printf(" "); } return 0; }
错误的,主要是输入的问题,无法想题目一样读入123456789098765432123456789这么大的数,一开始用的是long long数据类型存储,但测试数据超过了最大值。然后用数组存储数值,但输入形式又不对,我写的代码需要在每个数字之间加空格才可以存储进数组中。
于是:去找了答案,如下:
#include <stdio.h> #include <string.h> int main() { const char pinyin[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; int num, sum = 0; while(scanf("%1d", &num) != EOF) sum += num; char ans[4]; //给出的数 < 10^100,故各位数字之和最多为900 sprintf(ans, "%d", sum); for(int i = 0; i < strlen(ans); i++) { if(i != 0) printf(" "); printf("%s", pinyin[ans[i] - '0']);//‘0’-‘0’=0,0-‘0’=-48 } return 0; }
分析:
1. while(scanf("%1d", &num) != EOF)
在我们进行包括scanf等的输入函数使用时,其实用户在cmd中的输入实际是存放于缓冲区当中,当用户键入回车那一瞬间,之前输入的数据才会被存进去,而这里无论是单个字符还是字符串,我们都知道scanf的返回值呢是表示成功接受到的对象的个数,那这里如果遇到特殊情况,比如缓冲区文件流满等问题,那么scanf将如何处理呢?答案是返回-1 ! 这里不光是scanf,返回值为个数的函数,遇到文件流满大多都会返回-1,所以这个-1用的比较多,那么stdio.h就索性专门定义一个宏来表示,取End Of File(文件末尾的意思)的前三个字母即组成EOF,所以也就有了 #define EOF (-1) 这样的话!
2.头文件:#include <stdio.h>
sprintf()函数用于将格式化的数据写入字符串,其原型为:
int sprintf(char *str, char * format [, argument, ...]);
【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。
3.
pinyin[ans[i] - '0']
我自己摆弄了一些发现
用%d输出的话
‘0’-‘0’=0,0-‘0’=-48,‘1’-‘0’=1,1-‘0’=-47

浙公网安备 33010602011771号