mydjm

 

poj1002(木有字典升序输出)

Description

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。
电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下: 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,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。
如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)
你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。

Input

输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。

Output

对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.

Sample Input

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

Sample Output

310-1010 2
487-3279 4
888-4567 3
 
  1 #include<stdio.h>
2 #include<string.h>
3
4
5 void main()
6 {
7 char c[50][50];//min[8];
8 int i=0,j=-1,s,k,a[50],flag=0;
9 for(i=0;i<50;i++)//a全初始化为0
10 {
11 a[i]=0;
12 }
13 /****************** 输入 ************************/
14
15 scanf("%d",&s);
16 fflush(stdin);
17 for(i=0;i<s;i++)
18 {
19 do
20 {
21 j++;
22 scanf("%c",&c[i][j]);
23 }while(c[i][j]!='\n');
24 j=-1;
25 }
26
27 /****************** 输入完毕 ************************/
28
29 for(i=0;i<s;i++)//转换为标准格式
30 for(j=0;c[i][j]!='\n';j++)
31 {
32 if(c[i][j]=='A'|| c[i][j]=='B'|| c[i][j]=='C'|| c[i][j]=='2')
33 c[i][j]='2';//直接存才自己本身,省空间
34 if(c[i][j]=='D'|| c[i][j]=='E'|| c[i][j]=='F'|| c[i][j]=='3')
35 c[i][j]='3';
36 if(c[i][j]=='G'|| c[i][j]=='H'|| c[i][j]=='I'|| c[i][j]=='4')
37 c[i][j]='4';
38 if(c[i][j]=='J'|| c[i][j]=='K'|| c[i][j]=='L'|| c[i][j]=='5')
39 c[i][j]='5';
40 if(c[i][j]=='M'|| c[i][j]=='N'|| c[i][j]=='O'|| c[i][j]=='6')
41 c[i][j]='6';
42 if(c[i][j]=='P'|| c[i][j]=='R'|| c[i][j]=='S'|| c[i][j]=='7')
43 c[i][j]='7';
44 if(c[i][j]=='T'|| c[i][j]=='U'|| c[i][j]=='V'|| c[i][j]=='8')
45 c[i][j]='8';
46 if(c[i][j]=='W'|| c[i][j]=='X'|| c[i][j]=='Y'|| c[i][j]=='9')
47 c[i][j]='9';
48 if(c[i][j]=='Q'|| c[i][j]=='Z'|| c[i][j]=='-')
49 //c[i][j]=' ';//不处理的转成空格
50 {
51 for(k=j;c[i][k+1]!='\n';k++)//往前移
52 {
53 c[i][k]=c[i][k+1];
54 }
55 c[i][k]='\n';//把‘\n’也移过去
56 j--;//移动了弄回去
57 }
58 }//转换完毕
59 i=0;
60 while(i<s)
61 {
62 if(c[i][0]!='*')
63 {
64 for(j=i+1;j<s;j++)
65 {
66 /*if(0==strcmp(c[i],c[j]))//相等为0,比较是否相同
67 {
68 a[i]++;//这一行的相同数+1
69 c[j][0]='*';//被比较那个如果相同,首项赋值成*,方便上面“if(c[i][0]!='*')”判断
70 flag=1;//说明有相同的 flag当做布尔值判断
71 }
72 else continue;*/
73 for(k=0;k<7;k++)
74 {
75 if(c[i][k]==c[j][k]) continue;
76 else break;
77 }
78 if(k==7)//比较到最后,就是一样
79 {
80 a[i]++;
81 c[j][0]='*';
82 flag=1;
83 }
84 }
85 i++;
86 }
87 else
88 {
89 i++;
90 }
91 }
92
93 if(flag)
94 {
95 for(i=0;i<s;i++)
96 {
97 if(a[i]!=0)
98 {
99 for(j=0;c[i][j]!='\n';j++)
100 {
101 if(j==3) printf("-");
102 printf("%c",c[i][j]);
103 }
104 printf(" %d\n",a[i]+1);//a[i]+1的1是指自己本身也算一个
105 }
106 else continue;
107 }
108 /* if(a[i]!=0)
109 {
110 for(j=0;c[i][j]!='\n';j++)
111 {
112 c[m][j]=c[i][j];
113 }
114 c[m][7]=a[i]+48;//次数
115 m++;
116 }
117 else continue;
118 }//把相同的复制到c[0]~c[m] 下面开始比较
119
120 for(i=0;i<7;i++)
121 min[i]=c[0][i];//把第一个复制成最小
122 for(i=0;i<m-1;i++)
123 {
124 for(j=i+1;j<m-1;j++)
125 {
126 if(strncmp(min,c[j],7)>0)
127 {
128 for(k=0;k<7;k++)
129 min[k]=c[j][k];
130 }
131 else continue;
132 }
133 for(k=0;k<7;k++)
134 printf("%c",min[k]);
135 printf("%c\n",min[7]+1);
136
137 //再复制最小
138 for(p=0,q=1;p<7;p++,q++)
139 min[p]=c[q][p];
140 */
141 }
142 else//没有相同的
143 {
144 printf("No duplicates.");
145 }
146 return;
147 }

 
代码有些乱 注释里的代码都是不可行的。。。都是一开始的想法

实现方法不难 但是细节 细节 还有 不能乱用 strcmp跟strcpy。。断断续续地 花了几天

都忘了那些需要注意了 呵呵 后面的排序输出 想法有了 老是错 不理了。。

 

回头看了下代码 还是有需要注意的地方

①fflush(stdin);

清除scanf的回车 不然就给下面的字符数组给吸收了 这不是我要的效果 用getchar()也可以。

②输入字符型二维数组的方法

老是不知道判断结束是'\n' 还是'\0' 次次都要想。。。这次记住咯 别忘了

③if(c[i][j]=='A'|| c[i][j]=='B'|| c[i][j]=='C'|| c[i][j]=='2')

不能写成if(c[i][j]=='A'|| 'B'||'C'|| '2')

哈哈 这个错误 挺搞的

④对Q Z -的处理

这个想法一开始也没想到 本来是复制成null 仔细想想 不行

⑤比较是否相同

用strcmp就出错了,估计是数组后面一堆随机数惹的祸 用strncmp也是不行。。不深究

⑥不要老是用里面的条件判断

设置个flag标识是否存在相同的 这个想法也不错哦~~至少for me。。

⑦太多if木有else

这个 应该是不好的风格 要改 哈哈

⑧没写完。。

有机会再补充排序输出吧。

posted on 2011-11-19 16:28  mydjm  阅读(334)  评论(0编辑  收藏  举报

导航