读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
我的错误思路
- 输入的n,直接用int型变量来存储。事实上,n<=10^100,long long int型也存不了。
- 输出拼音时,用switch case语句来一一对应。其实没错,只是有些冗长。
- 正序分解sum时,do while循环条件是sum>0。第二个样例过不了。原因是,如果sum=1230,那么输出结果为yi er san,那个ling就输出不了。
解题思路
- 用字符数组n[102]来存储输入的n,每一位数累加到sum中,把sum正序分解,依次输出sum的每一位拼音。
- 初始化一个二维字符数组str[10][5],分别存ling到jiu的拼音,可以代替switch case来输出拼音。
- 注意正序分解sum的时候,循环条件看mask。
参考代码
#include <stdio.h>
#include <string.h>
int main()
{
char n[102];/*接收n的数组*/
int i;
char str[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
scanf("%s",n);
/*求n的各位数之和*/
int sum=0,len=strlen(n);
for(i=0;i<len;i++) {
sum+=n[i]-'0';
}
/*输出拼音*/
int t=sum,mask=1;
while(t>9) {/*求mask*/
t/=10;
mask*=10;
}
do {
int tmp=sum/mask;
printf("%s",str[tmp]);/*代替switch case输出拼音的部分*/
sum%=mask;
mask/=10;
if(mask) printf(" ");
} while(mask);/*注意这个循环条件*/
return 0;
}