问题描述: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 对应 9Q和Z没有对应的数字。于是,她在记录电话号码的时候为了好记,有的就换成数字所对应的大写字母来记了,如TUT-GLOP,就是888-4567。现在,她所在的公司里的客户联系电话有一大堆,她希望整理出有哪些重复的号码,请你写一个程序帮助她实现。 输入:每次执行只有一组测试数据,第一行是n(1<=n<=1000,000),其后n行是电话号码列表,号码中可能存在多个"-", 输出:输出有重复的电话号码,要按照样例那样的标准格式(不出现英文字母),其后跟随一个数字表示重复次数。没有重复的号码不要输出。多个电话号码之间按字典顺序由小到大排好。如果没有重复的号码,请输出一行No duplicates. 样例输入:124873279ITS-EASY888-45673-10-10-10888-GLOPTUT-GLOP967-11-11310-GINOF101010888-1200-4-8-7-3-2-7-9-487-3279 样例输出:310-1010 2487-3279 4888-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;}

评论