首先Up主发现,大学老师出的题很会唬人,讲真,不骗人~~~~~~
那么接下来,跟着Up主来分析一下这道题:
1、首先,这道题无非就是一道分解整数的题。不要被所谓的输出样式迷惑,要探求其本质!
2、此题没有任何数字大小的限制,只要求是整数,所以写出的程序必须能对整个整数数域可行!
3、对于输出的拼音,最好的方法Up主个人认为不是用字符串,而是函数+switch-case。
4、题的说明里,讲明了会有负数,所以在分解整数之前是不是应该用个小技巧将其先变成正整数呢?或者有更好的直接分解负数的方法也好,只是会不会更加麻烦呢?变为整数后,岂不是和整数分解方法一样吗?
5、到了划重点的时候了!
首先,对于分解一个整数,简单的方法就是不断地%并/10,直到这个数越来越小,最后留下1位为止。但是,本题给的情况并不能适用这个方法。要求内隐含着正向分解的要求。
如果输入的是123,输出的拼音总不能是san er yi吧。
下面说说Up主的方法,答案也是%并/10。只是,二位数才这么用。更高位的数%和/的是10的次方数。假如12345,从1开始的话就要/10000,才能得到1,然后再%10000得到2345。以此类推。
所以,先数出i位数,再用pow计算出10的i次方,最后就能开始开开心心的分解了!
附源码:
#include #include int pinyin(int x); //遵循C语言的模式,采用自定函数将部分运算转移出主函数
int main()
{
int zs = 0; //整数
int i = 0;
int cs = 1; //除数
double j;
scanf("%d", &zs);
if (zs < 0)
{
printf("fu ");
zs = zs * -1;
}
int lzs; //留存这个整数
lzs = zs;
//计算位数,从低位向高位拆数
for (i = 0; cs != 0; i++)
{
int a = 0;
a = zs % 10;
zs = zs / 10;
cs = zs;
}
zs = lzs; //恢复这个整数
for (; i != 0;)
{
j = pow (10,(i - 1)); //关键所在,从高位向低位拆数
int k = (int)j;
int mwsz = 0; //每位数字
mwsz = zs / k;
pinyin( mwsz ); //调用自定义函数,读出汉语拼音,将mwsz的值传出主函数
i--;
if (i != 0)
{
printf(" "); //空格的输出
}
zs = zs % k;
}
return 0;
}
int pinyin(int x) //自定义函数,通过main函数中的调用来实现功能,x是整形,接收同为整形的mwsz
{
switch ( x )
{
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;
}
}
最后感谢各位观众老爷的支持,欢迎点赞!!!