POJ 1002 487-3279、電話番号変換


タイトル:電話番号をよりよく記憶するために、数字を大文字の英語のアルファベットに変換し、アルファベットと数字の対応関係は以下の通りです.
A, B, and C map to 2  D, E, and F map to 3  G, H, and I map to 4  J, K, and L map to 5  M, N, and O map to 6  P, R, and S map to 7  T, U, and V map to 8  W, X, and Y map to 9 
電話番号の標準フォーマットは7桁で、3位と4位の間には888-4567などの「-」で区切られています.TUT-GLOPに対応する標準フォーマットは888-4567です.一連の記憶しやすい電話番号を入力し、2回以上現れた電話番号の標準フォーマットを出力し、辞書順にソートします.重複する電話番号がない場合は出力No duplicates.
入力:
1行目は電話番号の個数を入力し、2行目は電話番号の入力を開始し、各電話番号は1行を占め、入力された電話番号は大文字、数字、'-'から構成されている.
出力:
出力は2回以上繰り返される電話番号の標準フォーマットで、出力される電話番号は辞書順に並べ替えられます.重複がない場合は出力No duplicates.
問題解決の考え方:
1電話番号を整数に変換すると0~99999999の範囲となり、範囲が既知であるためバケツソートを採用し、大きさ1000000の配列Aをバケツとして開き、初期化内容は0となる.
2入力した電話番号を7桁の整数に変換してiとし、A[i]の値を1とする.
3入力終了後、走査配列Aは、A[i]が2以上であれば、出力iとA[i]、iが電話番号、A[i]が電話番号出現回数である.
コード:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

char getDigit(char ch)
{
  char num;
  if(ch<='9' && ch>='0') return ch-'0';	
  num = ch-'A';
  if(num > 15) num--;
  return num/3 + 2;
}


int transform(char s[])
{
	int i,result=0;
	for(i=0; i<256; i++)
	{
		if(s[i]=='\0') break;
		if(s[i] != '-') result = result*10 + getDigit(s[i]);
	}
	return result;
}

void print(int a, int count)
{
	int i=0;
	int base=1000000;
	char s[9];
	s[3]='-';
	s[8]='\0';
	for(;i<8;i++)
	{
		if(i!=3)
		{
		   s[i]=a/base+'0';
		   a = a%base;
		   base=base/10;
		}
    }
    printf("%s %d
",s, count); } int main() { int n,i,j,flag=0,phone; char s[256]; int *list = (int*)malloc(10000000*sizeof(int)); for(i=0; i<10000000; i++) list[i]=0; scanf("%d", &n); for(i=0; i<n; i++) { scanf("%s", s); phone = transform(s); list[phone]++; } for(i=0; i<10000000; i++) { if(list[i]>1) { flag=1; print(i, list[i]); } } if(!flag) printf("No duplicates."); return 0; }