论C语言习题,PTA天梯赛的“念数字”?
程序员文章站
2024-03-08 10:46:16
...
首先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 <stdio.h>
#include <math.h>
int pinyin(int x);
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 );
i--;
if (i != 0)
{
printf(" ");
}
zs = zs % k;
}
return 0;
}
int pinyin(int x)
{
int s = x;
switch ( s )
{
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;
}
}
最后感谢各位观众老爷的支持,欢迎点赞!!!
上一篇: Java将字节转换为十六进制代码分享
下一篇: JavaWeb实现文件上传与下载的方法