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)