欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

论C语言习题,PTA天梯赛的“念数字”?

程序员文章站 2024-03-08 10:46:16
...

论C语言习题,PTA天梯赛的“念数字”?

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

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