論C語言習題,PTA天梯賽的“念數字”?
阿新 • • 發佈:2019-01-06
首先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; } }
最後感謝各位觀眾老爺的支援,歡迎點贊!!!