题目:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
我的思路:
如果不考虑数据溢出和拼音输出,就例如输入12345,输出15。假设sum是我要求的值,那么这个题目其实就是让输入值每次模10给sum,然后输入值每次再除以10就能够解决。
那么现在把数据溢出考虑上的话,我们可以把输入的数存放到数组char arr[1000]中,这样,只要输入值n 小于 10^100,数据就不会溢出。这个时候上面模10除10的方法不适用了,但不难看出,只要把数组arr中的每个字符都减掉48再依次相加就可以得出要求的sum了。
这个时候再考虑将sum的值依次输出。当我们用while循环模10除10依次输出时,结果会是倒置的数,比如我输入12345,sum的值是15,但是while循环给出的值是5 1。这个时候我想到了用递归进行输出,出口是n<=9,对n的操作是n每次除10,然后我们在下面加上输出函数每次输出一个数字和一个空格。又因为题目要求最后不能有空格,那我向递归函数中再传一次n的值并用i保留,当n、i值相同时,说明就是原来最开始的数,那我输出时就不用加空格。
最后在考虑拼音的问题,这个时候我们只需要在原本的输出函数上加上switch语句把每个数字改成拼音即可。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int xiechuzhegeshu(char* arr)
{
int n = 0, i = 0;
while (arr[i]!='\0')
{
n += arr[i] - 48;
i++;
}
return n;
}
char pinyin(int n,int flag)
{
switch (n)
{
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");
default:
break;
}
if(flag==0) printf(" ");
}
void change(int n,int i)
{
if (n > 9) change(n / 10,i);
if (n != i)pinyin(n % 10, 0);
if (n == i)pinyin(n % 10, 1);
}
int main()
{
int i=0;
char arr[1000] = { 0 };
gets(arr);
int n = xiechuzhegeshu(arr);
change(n,n);
return 0;
}