VC6.0編譯運行通過
#include <stdio.h>
#define MAX 100000
int number[MAX]; //電話號碼
int count[MAX]; //重復次數
int totalNumber; //存儲了的號碼數量
int tab[128]; //碼表
int dup[MAX]; //重復了的號碼
int totalDup; //重復了的號碼數量
//初始化
void Init ( void )
{
int abcTab[26] = { 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,9 };
int i;
totalNumber = 0;
totalDup = 0;
memset ( tab, -1, 128 * sizeof(int) );
for ( i = '0'; i <= '9'; i++ )
tab[i] = i - '0';
memcpy ( tab + 'A', abcTab, sizeof(int) * 26 );
tab['-'] = 10;
return;
}
//增加號碼
void AddNumber ( int n )
{
int i;
for ( i = 0; i < totalNumber; i++ )
if ( number[i] == n )
{
count[i]++;
if ( count[i] == 2 )
{
dup[totalDup] = i;
totalDup++;
}
return;
}
if ( totalNumber == MAX )
{
printf ( "Error! Too many numbers\n" );
exit(1);
}
else
{
number[totalNumber] = n;
count[totalNumber] = 1;
totalNumber++;
}
return;
}
//將電話號碼從字符串轉變為整數
int StringToInt ( char *s )
{
int res;
res = 0;
for ( ; *s != 0; s++ )
{
if ( *s == '-' )
continue;
res *= 10;
res += tab[*s];
}
return res;
}
void swap ( int *a, int *b )
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
//給結果排序, 用冒泡
void Sort ( void )
{
int i, j;
int ni, nj;
int pa, pb;
ni = totalDup - 1;
for ( i = 0; i < ni; i++ )
{
nj = totalDup - i - 1;
for ( j = 0; j < nj; j++ )
{
pa = dup[j]; pb = dup[j+1];
if ( number[pa] > number[pb] )
{
swap ( number + pa, number + pb );
swap ( count + pa, count + pb );
}
}
}
return;
}
//輸出壹條結果
void Print ( int i )
{
const int n = 10000;
i = dup[i];
printf ( "%d-%d %d\n", number[i]/n, number[i]%n, count[i] );
return;
}
//用來控制輸入是從文件還是從stdin
//#define INPUT_FROM_TEST_FILE
#ifdef INPUT_FROM_TEST_FILE
FILE *fp;
#endif
//提示無結果並退出
void NoResult ( void )
{
printf ( "No duplicates.\n" );
#ifdef INPUT_FROM_TEST_FILE
fclose ( fp );
#endif
exit(2);
}
void main ( void )
{
int i, n;
char s[10000];
#ifdef INPUT_FROM_TEST_FILE
fp = fopen ( "test.txt", "r" );
if ( fp == NULL )
{
printf ( "Error!" );
exit(3);
}
#endif
Init();
#ifdef INPUT_FROM_TEST_FILE
fscanf ( fp, "%d", &n );
#else
scanf ( "%d", &n );
#endif
if ( n < 2 )
NoResult();
for ( i = 0; i < n; i++ )
{
#ifdef INPUT_FROM_TEST_FILE
fscanf ( fp, "%s", s );
#else
scanf ( "%s", s );
#endif
AddNumber ( StringToInt ( s ) );
}
Sort();
if ( totalDup == 0 )
NoResult();
for ( i = 0; i < totalDup; i++ )
{
Print ( i );
}
#ifdef INPUT_FROM_TEST_FILE
fclose ( fp );
#endif
}