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]が電話番号出現回数である.
コード:
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;
}