趣味PAT--循環-19. 幣值轉換(20),pat---19
One visible minute on the stage is attributed to ten years of invisible practice off the stage.
"台上一分鐘,台下十年功"
題目鏈接:循環-19. 幣值轉換(20)
輸入一個整數(位數不超過9位)代表一個人民幣值(單位為元),請轉換成財務要求的大寫中文格式。如23108元,轉換後變成“貳萬三仟壹百零捌”元。為了簡化輸出,用小寫英文字母a-j順序代表大寫數字0-9,用S、B、Q、W、Y分別代表拾、百、仟、萬、億。於是23108元應被轉換輸出為“cWdQbBai”元。
輸入格式:
輸入在一行中給出一個不超過9位的非負整數。
輸出格式:
在一行中輸出轉換後的結果。注意“零”的用法必須符合中文習慣。
輸入樣例1:
813227345
輸出樣例1:
iYbQdBcScWhQdBeSf
輸入樣例2:
6900
輸出樣例2:
gQjB
解題思路:hash映射,將a-j直接映射到字符數組的0-9號元素,將個位到億位映射到字符數組的0-8號元素,將輸入整數的每一位也映射到一個整型數組中,用作索引。然後從高位到低位順序掃描輸入的每一位,按照每一位轉換為“數量+單位”的格式將結果保存在一個字符數組中,具體見下面的代碼
注意點:多個連續0的情況,萬位的處理,個位的處理,注意下面幾個測試用例
①0; ②1; ③200; ④105005000; ⑤100505000; ⑥100055000;
AC代碼:

![]()
#include <iostream>
int main()
{
int a[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
int b[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
int c[] = {' ', 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};
int d[10] = { 0 };
int n, k = 0;
char out[20] = { 0 };
//last用來標記上一位是否為0,first用來標記億位到萬位之間是否全為0
int last = 0, first = 1;
std::cin >> n;
//用字符數組來保存輸入就可以避免使用除法,但是那樣可能不太直觀
for (int i = 8; i >= 0; i--)
d[i] = n / a[i] % 10;
for (int i = 8; i >= 0; i--)
{
//驗證億位到萬位之間是否全為0
if (i <= 7 && i >= 4 && d[i] != 0) {
first = 0;
}
if (d[i] != 0) {
out[k++] = b[d[i]];
//個位上沒有單位
if (i != 0)
out[k++] = c[i];
last = d[i];
} else if (last != 0 && i != 4) {
//這個位是0但上一個位不是0並且這個位不是萬位,如 200 的十位
out[k++] = b[d[i]];
last = d[i];
} else if ((i == 4) && first == 0) {
//萬位為0並且在萬位之前億位之後已經有非0位,如 100505000
if (out[k-1] == b[0]) {
//十萬位為0,則去掉十萬位的0,如 105005000
out[k-1] = c[i];
} else {
//十萬位非0,如 100555000
out[k++] = c[i];
}
last = 1;
}
}
//輸入為0
if (n == 0) {
out[k++] = b[0];
}
//如果個位是0,則要清除輸出結果中的0,如 200
if (out[k-1] == b[0] && k != 1) {
out[k-1] = '\0';
} else {
out[k] = '\0';
}
std::cout << out;
return 0;
}
View Code
總結:這道題看似簡單,但是其中有一些細節還是挺繞人的,非常考察對細節的處理能力,所以寫出來記錄一下,以後也會特別注意類似的問題