uva 755

 1 #include <iostream>
 2 #include <string>
 3 #include <map>
 4 #include <algorithm>
 5 #include <cstdio>
 6 #include <cctype>
 7 using namespace std;
 8 
 9 const char kTable[] = "2223334445556667Q77888999Z";
10 int main()
11 {
12     int T;
13     cin >> T;
14     bool first_output(true);
15     while(T--)
16     {
17         int n; cin >> n;
18         map<string, int> r;
19         for(int i = 1; i <= n; i++)
20         {
21             string t; cin >> t;
22             t.erase(remove(t.begin(), t.end(), '-'), t.end());
23             for(int j = 0; j < t.size(); j++)
24                 if(!isdigit(t[j]))
25                     t[j] = kTable[t[j]- 'A'];
26             t.insert(3, "-");
27             r[t]++;
28         }
29         if(first_output)
30             first_output = false;
31         else cout << endl;
32         bool found(false);
33         for(map<string, int>::iterator it = r.begin(); it != r.end(); it++)
34             if( it->second > 1)
35             {
36                 cout << it->first << " " << it->second << endl;
37                 found = true;
38             }
39         if(!found) cout << "No duplicates." << endl;
40     }
41     return 0;
42 }

另一种解法:

先將每一種不同格式的電話號碼全部換成7位數整數,
利用一個hash紀錄每一種電話號碼的出現的次數,
將出現兩次以上的電話號碼紀錄到一個陣列裡面,
再利用quicksort將這個陣列以電話號碼來排序,
最後從頭將電話號碼及其出現的次數輸出來即可。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<ctype.h>
  4 
  5 void quicksort( int start, int end, int array[] )
  6 {
  7     if( start < end )
  8     {
  9         int change = start;
 10         int i;
 11         int temp;
 12         for( i = start+1 ; i < end ; i++ )
 13             if( array[i] < array[start] )
 14             {
 15                 change++;
 16 
 17                 temp = array[i];
 18                 array[i] = array[change];
 19                 array[change] = temp;
 20             }
 21 
 22         temp = array[start];
 23         array[start] = array[change];
 24         array[change] = temp;
 25 
 26         quicksort( start, change, array );
 27         quicksort( change+1, end, array );
 28     }
 29 }
 30 
 31 int hash_numbers[10000005] = {0};
 32 
 33 int main()
 34 {
 35     int datasets;
 36     int blank;
 37     while( scanf( "%d", &datasets ) != EOF )
 38     {
 39         blank = 0 ;
 40         int numbers;
 41 
 42         while( datasets-- )
 43         {
 44             scanf( "%d", &numbers );
 45             getchar();
 46 
 47             int i;
 48             memset( hash_numbers, 0, sizeof(hash_numbers) );
 49             int output[100005] = {0};
 50             int output_saved = 0;
 51             for( i = 0 ; i < numbers ; i++ )
 52             {
 53                 char tempnum[1005];
 54                 gets( tempnum );
 55 
 56                 int templen = strlen( tempnum );
 57                 int tempnumint = 0;
 58                 int j;
 59                 for( j = 0 ; j < templen ; j++ )
 60                 {
 61                     if( isalnum( tempnum[j] ) )
 62                     {
 63                         tempnumint *= 10;
 64                         if( isdigit( tempnum[j] ) )
 65                             tempnumint += (int)(tempnum[j] - '0');
 66                         else
 67                         {
 68                             switch( tempnum[j] )
 69                             {
 70                                 case 'A': case 'B': case 'C':
 71                                     tempnumint += 2;
 72                                     break;
 73                                 case 'D': case 'E': case 'F':
 74                                     tempnumint += 3;
 75                                     break;
 76                                 case 'G': case 'H': case 'I':
 77                                     tempnumint += 4;
 78                                     break;
 79                                 case 'J': case 'K': case 'L':
 80                                     tempnumint += 5;
 81                                     break;
 82                                 case 'M': case 'N': case 'O':
 83                                     tempnumint += 6;
 84                                     break;
 85                                 case 'P': case 'R': case 'S':
 86                                     tempnumint += 7;
 87                                     break;
 88                                 case 'T': case 'U': case 'V':
 89                                     tempnumint += 8;
 90                                     break;
 91                                 case 'W': case 'X': case 'Y':
 92                                     tempnumint += 9;
 93                                     break;
 94                             }
 95                         }
 96                     }
 97                 }
 98                 hash_numbers[tempnumint]++;
 99                 if( hash_numbers[tempnumint] == 2 )
100                     output[output_saved++] = tempnumint;
101             }
102             quicksort( 0, output_saved, output );
103 
104             if( blank )
105                 printf( "
" );
106             blank = 1;
107 
108             for( i = 0 ; i < output_saved ; i++ )
109                 printf( "%03d-%04d %d
", output[i]/10000, output[i]%10000, hash_numbers[output[i]] );
110             if( output_saved == 0 )
111                 printf( "No duplicates.
" );
112         }
113     }
114     return 0;
115 }
原文地址:https://www.cnblogs.com/aze-003/p/5161058.html