給定多組電話號碼,格式包含數字、大寫字母及連字符。需將所有號碼統一轉換為標準格式(XXX-XXXX),找出重複出現的號碼並按字典序輸出及其出現次數。若無重複則輸出 "No duplicates."。
qsort 配合 strcmp 排序,相同號碼必相鄰,單次掃描即可統計重複次數char m[] = "22233344455566677778889999":字母映射表,索引 ch - 'A' 直接獲取對應數字char p[100000][9]:存儲最多 10 萬個標準化號碼(8 字符 + \0)char buf[1000]:臨時讀取原始輸入行#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char m[] = "22233344455566677778889999";
char p[100000][9], buf[1000];
int i, j, k, n, count, duplicate;
int compare(const void *elem1, const void *elem2) {
return strcmp((char *)elem1, (char *)elem2);
}
int main() {
scanf("%d\n", &n);
for (i = 0; i < n; i++) {
gets(buf);
for (k = j = 0; buf[j]; j++) {
if (buf[j] == '-') continue;
if (buf[j] >= 'A' && buf[j] <= 'Z') {
p[i][k] = m[buf[j] - 'A'];
} else if (buf[j] >= '0' && buf[j] <= '9') {
p[i][k] = buf[j];
}
if (++k == 3) p[i][k++] = '-';
}
}
qsort(p, n, 9, compare);
duplicate = 0;
count = 0;
for (i = 0; ++i <= n; ) {
count++;
if (strcmp(p[i-1], p[i])) {
if (count > 1) {
printf("%s %d\n", p[i-1], count);
duplicate = 1;
}
count = 0;
}
}
if (!duplicate) puts("No duplicates.");
return 0;
}
gets 或 fgets 讀整行char* 避免指針算術錯誤本題是字符串處理、排序應用與計數統計的經典組合,代碼簡潔高效,是 ACM 入門必刷好題。