刷PAT乙级的第一天 1002遇到了不小的困难
问题
1.我看到自然数小于10的100次方。首先想到用long int 来存储n。
但是!
即使是unsigned long long,最多也只有20位。10的100次方为100位。
查阅别人的资料,得知需要使用数组存储n,才可以解决。
2.计算结果sum怎么从int型转换为字符型
说来羞愧,半年前学完的c,现在什么都忘了,的确当时学的就不太好。
由于int型数字转换为char型需要减去48,所以结果这里直接进行减去,才可以得到正确的结果。 也许还会有更好地方法?
3.输出样例有些操蛋!
最后一个字符wu后面是没有空格的,哎,人生处处是陷阱。
只能用循环控制到最后一个字符之前。最后一个字符单独一个板块。
代码
#include<stdio.h>
//读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
int main()
{
char n[100]={0};
scanf("%s", n);
int count=0;
for (count; n[count]; count++);//计算得出输入字符的个数
int sum = 0;//初始化计算结果
for (int i = 0; i <= count; i++) {
sum += (int)n[i];//计算出sum的结果
}
sum=sum-count*48;
char sum1[4];//100位数字之和最多为900
int count2=0;//计算sum有几位
for (count2; sum; count2++) {
sum1[count2] = sum % 10;
sum = sum / 10;
}//sum1中是倒置的结果,count2记录sum的位数,方便转换成拼音。
count2--;
char m;//用于读取sum1中每个数字
for (int j = count2; j > 0; j--) {
m = sum1[j];//读取第j个数字
switch (m) {
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;
case 0:printf("ling"); break;
}
printf(" ");
}
m = sum1[0];
switch (m) {
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;
case 0:printf("ling"); break;
}
return 0;
}
感想
第一题很简单,没有意识到问题的严重性,结果第二题哐叽给了我一拳,基本的全忘了。aaa要赶紧补充知识了,难过······