正文

电话号码统计2007-07-01 11:50:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27255.html

分享到:

问题描述:
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;
}

阅读(2981) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册