这道题本身难度不是很大,就是细节和转化方面需要注意。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a[100010]={0};
//int b[100010]={0};
char t[200];
int x[7];
int main()
{
int n,num=0;
scanf("%d",&n);
while(n--)
{
memset(t,'\0',sizeof(t));
memset(x,0,sizeof(x));
scanf("%s",t);
int i,m,j=0;
m=strlen(t);
for(i=0;i<m;i++)//将字符串转化成整型数字串,方便后面的转换。
{
if(t[i]=='-')
continue;
if('0'<=t[i]&&t[i]<='9')
{
x[j]=t[i]-'0';
j++;
}
if('A'<=t[i]&&t[i]<='Z')
{
if(t[i]=='A'||t[i]=='B'||t[i]=='C')
{
x[j]=2;
j++;
}
if(t[i]=='D'||t[i]=='E'||t[i]=='F')
{
x[j]=3;
j++;
}
if(t[i]=='G'||t[i]=='H'||t[i]=='I')
{
x[j]=4;
j++;
}
if(t[i]=='J'||t[i]=='K'||t[i]=='L')
{
x[j]=5;
j++;
}
if(t[i]=='M'||t[i]=='N'||t[i]=='O')
{
x[j]=6;
j++;
}
if(t[i]=='P'||t[i]=='R'||t[i]=='S')
{
x[j]=7;
j++;
}
if(t[i]=='T'||t[i]=='U'||t[i]=='V')
{
x[j]=8;
j++;
}
if(t[i]=='W'||t[i]=='X'||t[i]=='Y')
{
x[j]=9;
j++;
}
}
}
int sum=0;
for(i=0;i<7;i++)//将整型数字串转换成整型数,方便后面的排序,因为题目要求按字典序输出电话号码。
{
sum=sum+x[i]*pow(10.0,(double)7-i-1);
}
a[num]=sum;
num++;
}
sort(a,a+num);
int count=1;
int i=0,f=0;
while(i<num)
{
if(a[i]==a[i+1])
{
f=1;
count++;
i++;
}
if(a[i]!=a[i+1]||i==num-1)
{
if(count>1)
{
printf("%d%d%d-%d%d%d%d ",a[i]/1000000,a[i]/100000-a[i]/1000000*10,a[i]/10000-a[i]/100000*10,a[i]/1000-a[i]/10000*10,a[i]/100-a[i]/1000*10,a[i]/10-a[i]/100*10,a[i]%10);
printf("%d\n",count);
}
//l=i+1;
i++;
count=1;
}
}
if(!f)
printf("No duplicates.\n");
return 0;
}