看板 C_and_CPP 關於我們 聯絡資訊
string convertL(long long); int main(int argc, char* argv[]) { int digit[] = {922,3372,10,10,5807}; long long n = 0; for(int i = 0; i < 5 ; i++) { n *= 10000; n += digit[i]; } cout << n << "=" << convertL(n) << endl; system("PAUSE"); return EXIT_SUCCESS; } string unit[] = {"","萬","億","兆","金"}; string num1[] = {"零","壹","貳","參","肆","伍","陸","柒","捌","玖"}; string num2[] = {"","拾","佰","仟"}; EX: 1234 從 4 開始往前轉換 若不為 4 位數,則 *zero 保證 true,且 loop 只跑到不為 0 的位數結束 若為 4 位數且無任何 0,則 loop 等同於 do { s.insert(0,num1[inNum%10],num2[i]); inNum /= 10; i++; } while(inNum > 0); 出現非 0 數後,出現第一次 0,則補,其餘不補,ex: 1001 ^^補 |不補 string convert4(int fourDigitNum, bool *zero) { string s; int i = 0,digit; bool appearNoneZero = false; do { digit = fourDigitNum % 10; fourDigitNum /= 10; if(digit > 0) { s.insert(0,num1[digit]+num2[i]); appearNoneZero = true; } else if(!(*zero) && !appearNoneZero) s.insert(0,num1[digit]); *zero = (digit == 0); i++; } while(fourDigitNum > 0); if(i < 4) *zero = true; return s; } 為 0 就不轉換 num < 0 ,則負號保留,num 看成 -num 轉換 每 4 位數一輪,當輪不為 0,則 先檢查前一輪首位為 0 且曾出現不為 0 的數,則補"零" 再插入當輪的數和單位 否則紀錄當輪首位為 0 最後看是否需要加"負" string convertL(long long num) { string s; if(num == 0) return s.insert(0,num1[0]); int i = 0,FDN = 0; bool zero = false,tailZero = true; bool neg = (num < 0); num *= (neg ? -1 : 1); do { FDN = (int)(num % 10000); num /= 10000; if(FDN > 0) { if(zero && !tailZero) s.insert(0,num1[0]); s.insert(0,convert4(FDN,&zero)+unit[i]); tailZero = false; } else zero = true; i++; } while (num > 0); s.insert(0,(neg ? "負" : "")); return s; } ※ 引述《Yshuan (倚絃)》之銘言: : 看完題目個人的想法是以下... : String sta[]; // 用來儲存輸出 : int top //配合sta仿stack結構 : bool dirty; : void main(){ : int n; //input number : sta = new; : top = 0; : String[] word = {"","萬","億","兆","金"...}; : int word_cnt = -1; : int remain; : while(n > 0){ : word_cnt++; : sta[top++] = word[word_cnt]; : remain = n%10000; : n = n / 10000; : convert_four(remain); : } : for(int i=top;i>=0;i--) : cout<<sta[i]; : ... : } : void convert_four(int n){ : String[] word = {"", "拾", "佰", "仟"}; : int word_cnt = -1; : int remain; : dirty = f; //初始化成 if(r==0)不補零 : while(n > 0){ : word_cnt++; // start increaing from 0 : sta[top++] = word[word_cnt]; //預設都放入word : remain = n % 10; : n = n/10; : if(remain==0){ : sta[--top] = ""; //沒有餘數word拿出 : if(dirty){ //跳過需補零 dirty 防止連補兩次以上 : sta[top++] = "零"; : dirty = f; : } : break; //跳出迴圈 不做convert(); : } : convert(remain); //將餘數轉成一到九 : } : } : void convert(int r){ : dirty = t; //補零開關打開 : switch(r) //那個浩大的switch : case ?: : sta[top++] = "數字一到九其中一個"; //九個case去衝 : ... : } : ---------------------------------- : 囧 不自覺得都打了 精神是stack : 先以四個位數為單位寫成一個四位數轉換函數 : 因為中文讀法規則 習慣以10^4為一個大單位... : 十百千都重複 故寫成 convert_four(int) : 不斷的取remain 並且若不是零就call convert(int) : 關於放零的動作用了一個bool開關 可能有點複雜 : ... : 然後整個寫完之後 才發現網站是高中生程式 XD : 假如原PO 能google stack然後看懂這篇code : 相信大學上資結會快速上手 XD! 關鍵字 >>> "先進後出" : 至於你原本的code 我大概懂你的概念是先一對一轉換 : 再比對零的分布情形 做輸出零的調整 : 個人感覺分布組合太多種 所以就不使用一堆if的寫法了... : 也許有點小題大做了吧 ~ ^^! 還請板上其他高手指正一下~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.9.2 ※ 編輯: csihcs 來自: 211.74.9.2 (10/20 12:50) ※ 編輯: csihcs 來自: 211.74.9.2 (10/22 00:16)