本文精選 PAT(程序設計能力測試)字符串處理經典題目,涵蓋科學計數法還原、千分位格式化、數字拼寫、密碼混淆字符修正四大高頻考點,提供完整 C++ 解法代碼、核心邏輯解析與邊界處理技巧,適合 PAT 備考與面試刷題強化。
輸入符合正則 [+-][1-9]\.[0-9]+E[+-][0-9]+ 的科學計數法字符串,輸出普通十進制表示,保留所有有效位(含尾部0)。指數絕對值 ≤ 9999,長度 ≤ 9999。
0.00xxx// 統一處理邏輯
int pos = str.find('E');
string sign = (str[0] == '-') ? "-" : "";
string mantissa = str.substr(1, pos-1); // 去符號的尾數
int exp = stoi(str.substr(pos+2)); // 指數值
char expSign = str[pos+1]; // '+' 或 '-'
if (exp == 0) { cout << sign << mantissa; }
else if (expSign == '-') {
cout << sign << "0.";
for (int i=0; i 0
for (int i=0; i
題目二:A1001 A+B Format(20分)
問題描述
輸入兩整數 a,b(|a|,|b|≤1,000,000),輸出和的標準千分位格式(每3位一逗號,不足4位不加逗號)。
核心邏輯
- 計算 sum = a+b,處理負號
- 反向提取數字存入數組
- 逆序輸出,每3位插入逗號(非最高位)
代碼實現
int sum = a + b;
if (sum < 0) { printf("-"); sum = -sum; }
int digits[20], len = 0;
do { digits[len++] = sum % 10; sum /= 10; } while (sum);
for (int i = len-1; i >= 0; i--) {
printf("%d", digits[i]);
if (i > 0 && i % 3 == 0) printf(",");
}
題目三:A1005 Spell It Right(20分)
問題描述
輸入非負整數 N(≤10¹⁰⁰),輸出各位數字之和的英文拼寫(零到九),單詞間單空格。
代碼實現
char* words[10] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
string s; cin >> s;
int sum = 0;
for (char c : s) sum += c - '0';
int digits[20], len = 0;
do { digits[len++] = sum % 10; sum /= 10; } while (sum);
for (int i = len-1; i >= 0; i--) {
printf("%s", words[digits[i]]);
if (i) printf(" ");
}
題目四:A1035 Password(20分)
問題描述
輸入 N 個賬號(用戶名 密碼),將密碼中混淆字符替換:1→@, 0→%, l→L, O→o。輸出修改過的賬號數及詳情;無修改時按單複數輸出特定句子。
代碼實現
struct Account { string name, pwd; bool changed; } acc[1005];
int n, cnt = 0; cin >> n;
for (int i=0; i> acc[i].name >> acc[i].pwd;
for (int i=0; i
字符串處理通用技巧總結
技巧 應用場景 代碼模式
字符串作數組處理 大整數、超長輸入 string s; s[i]-'0'
反向提取數字 格式化輸出、進制轉換 do{d[len++]=n%10;n/=10;}while(n);
查找分隔符 科學計數法、IP解析 pos=find('E'); substr(0,pos)
字符級遍歷修改 密碼混淆、脫敏 for(char& c: s) { if(...) c=...; }
邊界情況單獨處理 0值、負號、空串 if(sum==0) 特判
總結
PAT 字符串處理題核心考察:大數字符串運算、格式化輸出控制、字符級精確操作、邊界條件全覆蓋。本文四題涵蓋了科學計數法還原(指數移位邏輯)、千分位格式化(反向分組)、數字拼寫(求和+拆分)、密碼修正(字符映射+統計)四大經典模式。建議讀者重點掌握「字符串作數組」、「反向提取數字」、「分隔符分割」三大通用技巧,舉一反三應對變體題目。