[問題] c 數字轉國字

看板C_and_CPP作者 (風吹誰懂)時間6年前 (2018/06/02 11:58), 6年前編輯推噓1(1023)
留言24則, 5人參與, 6年前最新討論串1/2 (看更多)
開發平台(Platform): (Ex: Win10, Linux, ...) win8 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) stdio.h 問題(Question): 如何顯示成 平常國字標準數字念法 末幾位是0 不顯示 從最左邊起 遇到大於等於一個0 只顯示一個零 餵入的資料(Input): 42002500 預期的正確結果(Expected Output): 肆仟貳百萬貳仟五百元 錯誤結果(Wrong Output): 肆仟貳百零零貳百五十零元 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) https://ideone.com/XnET5L #include <stdio.h> void p1(int); void p2(int); char *dig[] = {"零","壹","貳","參","肆","伍","陸","柒","捌","玖"}; char *fer[] = {"\0","十","百","仟","萬","十","百","仟","億"}; int times=0; int main() { int n; printf("N = "); scanf("%d",&n); p1(n); printf("元\n"); return 0; } void p1(int n) { int prefix,curryDig; if( n < 10){ printf("%s",dig[n]); p2(times); } else{ prefix = n / 10; times++; p1(prefix); times--; curryDig = n % 10; if(curryDig == 0){ int count = 0; while( prefix % 10 == 0){ count++; prefix /= 10; times--; curryDig = prefix % 10; } if(times != 0) printf("%s",dig[0]); } else{ printf("%s",dig[curryDig]); p2(times); } } } void p2(int times) { printf("%s",fer[times]); } 補充說明(Supplement): times當成從後面數來第幾個 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.82.122.178 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1527911899.A.126.html

06/02 12:22, 6年前 , 1F
開個陣列把國字結果存起來 然後把不要的部份去掉才輸出
06/02 12:22, 1F

06/02 12:25, 6年前 , 2F
我執行你的code得到肆仟貳百零零貳百伍十零元
06/02 12:25, 2F

06/02 12:26, 6年前 , 3F
也就是 我不要直接printf 而是存到新陣列裡 去掉再印
06/02 12:26, 3F

06/02 12:27, 6年前 , 4F
阿 沒有萬 不好意思打錯了
06/02 12:27, 4F
※ 編輯: a346571358 (111.82.122.178), 06/02/2018 12:27:54

06/02 12:30, 6年前 , 5F
這個用遞迴來做感覺不太適合
06/02 12:30, 5F

06/02 12:31, 6年前 , 6F
那有什麼其他想法嗎 歡迎告訴我
06/02 12:31, 6F

06/02 12:33, 6年前 , 7F
logical先列出來,什麼時候要零,什麼時候不要零
06/02 12:33, 7F

06/02 12:34, 6年前 , 8F
什麼時候加萬,什麼時候加億,先列出來
06/02 12:34, 8F

06/02 12:38, 6年前 , 9F
要遞迴也弄個儲存空間吧 這會需要知道之前輸出什麼
06/02 12:38, 9F

06/02 12:38, 6年前 , 10F
你是Curry粉絲嗎?命名要加強一下
06/02 12:38, 10F

06/02 12:39, 6年前 , 11F
最起碼要知道上一次輸出什麼
06/02 12:39, 11F

06/02 12:40, 6年前 , 12F
關於儲存空間是用一個變數 存進去嗎
06/02 12:40, 12F

06/02 12:41, 6年前 , 13F
複雜一點的自動機就有儲存 但是一般寫遞迴都不會強調
06/02 12:41, 13F

06/02 12:42, 6年前 , 14F
儲存空間比較正式的方法是宣告一個陣列或變數 每次遞迴
06/02 12:42, 14F

06/02 12:43, 6年前 , 15F
一直把這個陣列或變數傳下去 偷懶可以用全域變數
06/02 12:43, 15F

06/02 12:43, 6年前 , 16F
畢竟這個程式就是...一直印出 若改成把輸出的值都存
06/02 12:43, 16F

06/02 12:43, 6年前 , 17F
到陣列裡面 再用條件去限制這陣列來控制輸出值呢
06/02 12:43, 17F

06/02 12:46, 6年前 , 18F
照我看他有一個地方用到儲存 就是上次有沒有印出零
06/02 12:46, 18F

06/02 12:47, 6年前 , 19F
如果上次是零這次還是零就不印出 利用儲存會很好克服
06/02 12:47, 19F

06/02 13:04, 6年前 , 20F
我還是..先問一下怎麼用陣列存國字好了..
06/02 13:04, 20F

06/02 13:11, 6年前 , 21F
沒事 我現在已經都存在一個陣列了 不過那條件
06/02 13:11, 21F

06/02 13:54, 6年前 , 22F
zerojudge 中文大寫數字. 已廢題但有參考資料
06/02 13:54, 22F

06/02 14:08, 6年前 , 23F
有辦法傳回來times回到main函數是對的值嗎
06/02 14:08, 23F

06/02 15:27, 6年前 , 24F
謝謝樓上所有大大 完工了
06/02 15:27, 24F
文章代碼(AID): #1R4XNR4c (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1R4XNR4c (C_and_CPP)