本文精選 PAT(程序設計能力測試)入門級字符串處理經典題目:B1006 換個格式輸出整數 與 B1021 個位數統計,提供完整 C++ 解法、核心邏輯解析、邊界處理技巧,適合 PAT 乙級備考熱身與基礎語法鞏固。
輸入正整數 n (<1000),用字母 B 表示「百」、S 表示「十」、12...n 表示個位數字。例:234 → BBSSS1234(2百、3十、個位4)。
#include <cstdio>
int main() {
int n; scanf("%d", &n);
int digits[5], cnt = 0;
while (n) { digits[cnt++] = n % 10; n /= 10; } // 逆序存儲:個、十、百
for (int i = cnt-1; i >= 0; i--) {
if (i == 2) for (int j=0; j
樣例驗證
輸入 分解 輸出 說明
234 百=2, 十=3, 個=4 BBSSS1234 2個B, 3個S, 1234
23 十=2, 個=3 SS123 無百位,2個S, 123
9 個=9 123456789 僅個位
題目二:B1021 個位數統計(15分)
問題描述
輸入不超過 1000 位的正整數 N,統計每種數字出現次數,按數字升序輸出 D:M 格式。
核心邏輯
- 字符串讀取(超長整數無法用數值類型)
- 長度為 10 的計數數組
cnt[10],遍歷字符串 cnt[c-'0']++
- 順序遍歷 0-9,計數>0 時輸出
代碼實現
#include <cstdio> #include <cstring>
#define MAXL 1010
char s[MAXL];
int main() {
gets(s); // 或 scanf("%s", s)
int cnt[10] = {0}, len = strlen(s);
for (int i=0; i
樣例驗證
輸入:100311
輸出:
0:2
1:3
3:1
通用技巧總結
技巧 適用場景 代碼模式
整數分解位數 位權相關題目 while(n){d[c++]=n%10;n/=10;}
字符串處理大整數 超長數值輸入 gets(s); s[i]-'0'
計數數組統計字符 字符頻率統計 int cnt[10]={0}; cnt[c-'0']++
逆序存儲/正序輸出 位分解後高位優先 for(i=cnt-1;i>=0;i--)
特殊格式輸出 題目定制輸出規則 分情況 if/else 處理
易錯點提醒
- B1006 個位輸出規則:輸出
12...n 而非數字本身。如個位是 4 輸出 1234,不是 4
- B1006 無前導零:輸入保證無前導零,但內部分解需處理百位/十位為 0 的情況(不輸出對應字符)
- B1021 輸入長度:≤1000 位,必須用字符串,不可用
long long 或 double
- 輸出順序:B1021 要求按數字升序(0→9),非出現順序
- gets 安全性:現代編譯器棄用
gets,建議用 fgets(s, MAXL, stdin) 或 scanf("%1000s", s)
總結
PAT 入門字符串題核心考察:整數與字符串互轉、位分解與重組、計數統計、格式化輸出控制。B1006 鍛煉位分解與條件輸出邏輯,B1021 鞏固字符串作大數容器與計數數組思想。兩題均屬「模擬類」,無複雜算法,關鍵在於邊界條件全覆蓋(如 0、個位數、缺位情況)與輸出格式精確匹配。建議初學者多手寫、多測試邊界用例,建立「字符串即字符數組」的直覺思維。