解題思路:首先建立題目要求的映射關係,其次將輸入的字符串進行提取,轉換成電話號碼,利用map容器的有序性質進行存儲電話號碼,電話號碼自動有序,然後按照題目要求進行輸出即可。
#include <stdlib.h>
#include "PhoneBookProcess.h"
/*
功能: 檢查是否有兩個或多個公司擁有相同的電話號碼,並統計輸出
輸入參數: inFileName - 包含個性電話號碼個數與列表的源文件名
[格式請見題目說明PPT]
outFileName - 輸出統計重複號碼的結果的目標文件名
[格式請見題目說明PPT]
輸出參數: 無
返回: 0 - 成功
1 - 其它各種錯誤,如文件不存在
*/
int PhoneBookProcess(const char *inFileName,const char *outFileName)
{
if(freopen(inFileName,"r",stdin)==NULL)
return 1;
if(freopen(outFileName,"w",stdout)==NULL)
return 1;
/*1.映射關係,可以優化成
char hsm[]="222333444555666777888999"*/
int hsm[26];
hsm[0]=2;
hsm[1]=2;
hsm[2]=2;
hsm[3]=3;
hsm[4]=3;
hsm[5]=3;
hsm[6]=4;
hsm[7]=4;
hsm[8]=4;
hsm[9]=5;
hsm[10]=5;
hsm[11]=5;
hsm[12]=6;
hsm[13]=6;
hsm[14]=6;
hsm[15]=7;
hsm[16]=7;
hsm[17]=7;
hsm[18]=7;
hsm[19]=8;
hsm[20]=8;
hsm[21]=8;
hsm[22]=9;
hsm[23]=9;
hsm[24]=9;
hsm[25]=9;
int n;
int cas=0;
char str[50];
scanf("%d",&n);
/**/
map<int,int> m;
map<int,int>::iterator it;
bool flag=false;
for(cas=0;cas<n;cas++) {
scanf("%s",str);
int num=0;
int len=strlen(str);
/*將字符串轉換成電話號碼*/
for(int i=0;i<len;i++) {
if(str[i]>='0'&&str[i]<='9')
num=num*10+str[i]-'0';
else if(str[i]>='A'&&str[i]<='Z')
num=num*10+hsm[str[i]-'A']; /*對應關係*/
else if(str[i]>='a'&&str[i]<='z')
num=num*10+hsm[str[i]-'a'];
}
if(num==0)
continue;
m[num]++;
}
/**/
for(it=m.begin();it!=m.end();it++) {
if(it->second>1)
flag=true;
}
if(flag==false)
printf("No duplicates.\n");
else {
for(it=m.begin();it!=m.end();it++) {
if(it->second>1)
printf("%d %d\n",it->first,it->second);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}