PAT乙级1002 写出这个数 (20 分)——C
题目描述
做题思路
- 想到用数组取录入输入的数字,并用数字的遍历求和,但是数字很大,经过测试long long也无法装下,所以只能用字符数组来录入
- 用switch case来把数字转换为拼音
- 根据题目要求,不能在switch case中的条件句后添加空格,只能在求出总数后,再对数字进行位数的分解,插入空格,根据数字位的排序,要用到递归中栈的属性
题目代码
#include <stdio.h>
int translate(int x);
int space(int x);
int main()
{
long long n = 0;
char a[101] = {0};
int i= 0;
scanf("%s",a);
while(a[i])
{
n += a[i]-'0';
i++;
}
space(n);
return 0;
}
int space(int x)
{
if(x)
{
space(x/10);
if(x>9)
{
printf(" ");
}
translate(x%10);
}
return 0;
}
int translate(int x)
{
switch(x)
{
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;
}
总结
- 数组的录入可以用char,然后用数字的编码减去‘0’,就可以得到数字在编码中的数
- 录入数字有两个 方法,我自己用的是输入到数组里,再从数组取出来,会比较麻烦;还有一个方法就是取数字在编码中的数,不需要数组这个媒介,会简单很多(后面发现数字量大了后必须使用字符数组来输入)
- 可以用递归简化程序,但目前自己还掌握的不好
- 数组可以用while循环,不用for循环,因为不确定循环多少次时用while更方便
- 特别大的数可以用long long,在第一次写时用的long,发现不够用(scanf输入longlong型数据时,需要用%lld,本题之前做的时候用的整数数组,后来改成了字符数组,这个就没用上)
- 尽量把程序函数写出mian函数,用声明看着简洁一些
- if(x)不等于0时,程序运行