论程序设计Test,PTA天梯赛的“L1-007 念数字”?

论程序设计Test,PTA天梯赛的“L1-007 念数字”?_第1张图片

首先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;
    } 
}

最后感谢各位观众老爷的支持,欢迎点赞!!!

你可能感兴趣的:(PTA)