程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 趣味PAT--循環-19. 幣值轉換(20),pat---19

趣味PAT--循環-19. 幣值轉換(20),pat---19

編輯:C++入門知識

趣味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

總結:這道題看似簡單,但是其中有一些細節還是挺繞人的,非常考察對細節的處理能力,所以寫出來記錄一下,以後也會特別注意類似的問題

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved