《C和指針》習題:編寫 void written_amount(unsigned int amount, char *buffer),將無符號整數轉為英文大寫單詞(如 16312 → "SIXTEEN THOUSAND THREE HUNDRED TWELVE")。
#include <stdio.h>
#include <string.h>
void written_amount(unsigned int amount, char *buffer);
int main() {
unsigned int num; scanf("%u", &num);
char b[100] = {0};
written_amount(num, b);
puts(b);
return 0;
}
void written_amount(unsigned int amount, char *buffer) {
static int count = 0; // 千分位計數
char *w1_9[] = {"ZERO","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};
char *w10_19[] = {"TEN","ELEVEN","TWELVE","THIRTEEN","FOURTEEN","FIFTEEN","SIXTEEN","SEVENTEEN","EIGHTEEN","NINETEEN"};
char *wty[] = {"","","TWENTY","THIRTY","FORTY","FIFTY","SIXTY","SEVENTY","EIGHTY","NINETY"};
char *wdiv[] = {"HUNDRED","THOUSAND","MILLION","BILLION"};
unsigned int high = amount / 1000;
if (high) { count++; written_amount(high, buffer); } // 遞歸處理高位
int val = amount % 1000; // 當前三位
if (val >= 100) {
strcat(buffer, " "); strcat(buffer, w1_9[val/100]);
strcat(buffer, " "); strcat(buffer, wdiv[0]); // HUNDRED
val %= 100;
}
if (val >= 20) {
strcat(buffer, " "); strcat(buffer, wty[val/10]);
val %= 10;
}
if (val >= 10) {
strcat(buffer, " "); strcat(buffer, w10_19[val%10]);
} else if (val > 0) {
strcat(buffer, " "); strcat(buffer, w1_9[val]);
}
if (count > 0) {
strcat(buffer, " "); strcat(buffer, wdiv[count--]);
strcat(buffer, " ");
}
}
| 輸入 | 輸出 |
|---|---|
| 0 | ZERO |
| 12 | TWELVE |
| 100 | ONE HUNDRED |
| 1200 | ONE THOUSAND TWO HUNDRED |
| 16312 | SIXTEEN THOUSAND THREE HUNDRED TWELVE |
| 1000000 | ONE MILLION |
static count 跨遞歸層級傳遞千分位層數,無需額外參數。buffer 上操作,調用者負責分配足夠空間。此算法是金融系統、報表生成中數字轉文字的基石實現。