问题描述:
Felicia发现电话机上的数字下方有对应的三个英文字母:
A, B, C 对应 2
D, E, F 对应 3
G, H, I 对应 4
J, K, L 对应 5
M, N, O 对应 6
P, R, S 对应 7
T, U, V 对应 8
W, X, Y 对应 9
Q和Z没有对应的数字。
于是,她在记录电话号码的时候为了好记,有的就换成数字所对应的大写字母来记了,如TUT-GLOP,就是888-4567。现在,她所在的公司里的客户联系电话有一大堆,她希望整理出有哪些重复的号码,请你写一个程序帮助她实现。
输入:
每次执行只有一组测试数据,第一行是n(1<=n<=1000,000),其后n行是电话号码列表,号码中可能存在多个"-",
输出:
输出有重复的电话号码,要按照样例那样的标准格式(不出现英文字母),其后跟随一个数字表示重复次数。没有重复的号码不要输出。多个电话号码之间按字典顺序由小到大排好。如果没有重复的号码,请输出一行No duplicates.
样例输入:
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
样例输出:
310-1010 2
487-3279 4
888-4567 3
// 动态内存老是RUNTIME ERROR
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct node{
char str[8];
}NODE;
NODE p[1000002];
int myCmp(const NODE *a, const NODE *b){
return strcmp(a->str,b->str);
}
void putOut(char *str,int n){
int i;
for(i=0; i < 7; i++){
if(i==3)
putchar('-');
putchar(str[i]);
}
printf(" %d\n",n);
}
int main(){
char c;
unsigned int i,j,t,n,flag;
scanf("%d",&n);
getchar();
for(i=0; i < n; i++){
for(t=0; ; ){
c=getchar();
if(c == '\n')
break;
if(c >= '0' && c <= '9')
p[i].str[t++] = c;
else if(c >= 'A' && c <= 'O')
p[i].str[t++] = (c - 'A')/3+50;
else if(c >= 'T' && c <= 'Y')
p[i].str[t++] = (c - 'T')/3+56;
else if(c=='P' || c=='R' || c=='S')
p[i].str[t++] = 55;
}
p[i].str[t] = '\0';
}
qsort(p,n,sizeof(NODE),myCmp);
strcpy(p[n].str,"sdkfjskd");
for(flag=t=j=0,i=1; i <= n; i++){
if(strcmp(p[t].str,p[i].str)){
if(i-t >= 2){
putOut(p[t].str,i-t);
flag = 1;
}
t = i;
}
}
if(!flag)
printf("No duplicates.\n");
return 0;
}
评论