1. 程式人生 > >論C語言習題,PTA天梯賽的“念數字”?

論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;
    } 
}

最後感謝各位觀眾老爺的支援,歡迎點贊!!!