问题:将一连串的字符转化成用数字表示的数字串 ,如:
3234567 ----- 323-4567
888-GINO ----- 888-1010
3-10-10-10 ----- 310-1010
-8-2-3-5-7-2-9- -- 823-5729
该问题的关键点在于去 ‘-’ 和 将对应的字符映射到数字,见代码:
1 /************************************************************************/
2 * Author: bakari
3 * Date :2012/6/5
4 * StandardPhoneNum
5 /************************************************************************/
6 #include <iostream>
7 #include <string.h>
8 #include <algorithm>
9 using std::cout;
10 using std::cin;
11 using std::endl;
12
13 const int STRLEN = 9;
14 const int MAXSTRLEN = 50;
15 const int MAXROW = 10000;
16
17 char map[] = "22233344455566677778889999"; //存储映射表
18 char TranseStr[MAXROW][STRLEN];
19 //char str[MAXSTRLEN];
20
21 int cmp (const void * elem1, const void * elem2){ //快排比较函数
22 return strcmp((char *)elem1, (char *)elem2);
23
24 }
25 void StandardTranse(const char *str, int n){
26
27 for(size_t i = 0, j = 0; j < STRLEN - 1; ){
28 if(str[i] != '-'){
29 if(str[i] <= 'Z' && str[i] >= 'A')
30 TranseStr[n][j] = map[str[i] - 'A'];
31 if(str[i] <= '9' && str[i] >= '0')
32 TranseStr[n][j] = str[i];
33 ++ i;
34 ++ j;
35 }
36 else{
37 ++ i;
38 }
39 if(3 == j){
40 TranseStr[n][j++] = '-';
41 }
42 }
43 }
44
45 void FindSameNum(int n){
46 int ix = 0;
47 int jx;
48 bool noduplicate = true;
49 while(ix < n){
50 jx = ix;
51 ++ ix;
52 while(ix < n && strcmp(TranseStr[ix],TranseStr[jx]) == 0)
53 ++ix;
54 if (ix - jx > 1){
55 cout << TranseStr[jx] << " " << ix - jx <<endl;
56 noduplicate = false;
57 }
58 }
59 if (noduplicate)
60 cout << "No duplicate." << endl;
61 }
62
63 int main()
64 {
65 int n;
66 char str[MAXSTRLEN];
67 cin >> n;
68 for(int i = 0; i != n; ++i){
69 cin >> str;
70 StandardTranse(i);
71 }
72 cout << "输出" <<endl;
73 for(int i = 0; i != n; ++i)
74 cout << TranseStr[i] << endl;
75
76 qsort(TranseStr,n,STRLEN,cmp);
77 FindSameNum(n);
78 return 0;
79 }
标准化函数StandardTranse()的另一个解法
1 void StandardTranse(const char *str, int n){
2 int j ,k;
3 j = k = -1;
4 while(k < STRLEN - 1){
5 j ++;
6 if(str[j] == '-') //先做判断
7 continue;
8 k ++;
9 if(3 == k)
10 TranseStr[n][k ++] = '-';
11 if(str[j] >= 'A' && str[j] <= 'Z'){
12 TranseStr[n][k] = map[str[j] - 'A'];
13 continue;
14 }
15 TranseStr[n][k] = str[j];
16 }
17 TranseStr[n][k] = '\0';
18 }