この問題のタスクは簡単である:入力番号の位置をハッシュテーブルに異なる正の整数の配列を挿入し、出力します。ハッシュ関数は、と定義される 場合( T Sの私用のZ Eは、ハッシュテーブルの最大サイズである。二次の)のみ正の増分で(プローブの衝突を解決するために使用されます。
テーブルサイズが素数であることを優れていることに注意してください。ユーザーが指定した最大サイズが素数でない場合は、テーブルのサイズは、ユーザによって与えられたサイズよりも大きい最小の素数であることを再定義する必要があります。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、2つの正の数含ま M S I Z E(≤)及び N(それぞれ、ユーザー定義テーブルサイズと、入力番号の数である≤)。次いで、 N個の異なる正の整数は、次の行に示されています。行のすべての数字は、スペースで区切られます。
出力仕様:
各テストケースのために、1つのラインの入力番号の対応する位置(0からインデックス開始)を印刷します。行のすべての数字は、スペースで区切られ、行の末尾に余分なスペースがあってはなりません。「 - 」の代わりにケースでは、印刷、番号を挿入することは不可能です。
サンプル入力:
4 4
10 6 4 15
サンプル出力:
0 1 4 -
1 の#define _CRT_SECURE_NO_WARNINGS 2の#include <stdio.hの> 3の#include < malloc関数 .H> 4の#include <math.h>の 5 の#define MAXTABLESIZE 20000 6 7のtypedef int型のElementType。 8 typedefを列挙{正当な、空の削除} EntryType。 9のtypedef 構造体HashEntry細胞。 10 構造体HashEntry 11 { 12 のElementTypeデータ。 13 EntryType情報。 14 }。 15 16のtypedef 構造体 HblNode * ハッシュテーブル。 17 構造体 HblNode 18 { 19 INT TableSize。 20 セル* 細胞; 21 }。 22 23 INT NextPrime(INT N) 24 { 25 であれば(N == 1 ) 26 リターン 2 。 27 INT P =(N%2)?N + 2:N + 1 。 28 INT I; 29 しばらく(p <= MAXTABLESIZE) 30 { 31 のための式(I(= INT)SQRT(P); I> 2 ; i-- ) 32 であれば(P%I == 0 ) 33 ブレーク。 34 もし(I == 2)ブレーク。 35 他の 36 のp + = 2 ; 37 } 38 リターンP。 39 } 40 int型のハッシュ(INTキー、INT TableSize) 41 { 42 リターンキー%のTableSize。 43 } 44ハッシュテーブルCreateHashTable(INT TableSize) 45 { 46 ハッシュテーブルH。 47 H =(ハッシュテーブル)はmalloc(はsizeof(構造体HblNode))。 48 H-> TableSize = NextPrime(TableSize)。 49 H->細胞=(細胞*)はmalloc(H-> TableSize * はsizeof (セル))。 50 のために(INT iが= 0 ; iが<H-> TableSize; I ++ ) 51 H->細胞[I] .INFO = 空にする。 52 リターンH。 53 } 54 55 int型の検索(ハッシュテーブルH、キーのElementType) 56 { 57 のint NewPos、CurPos。 58 INT CNUM = 0 ; 59 NewPos = CurPos =ハッシュ(キー、H-> TableSize)。 60 一方(H->細胞[NewPos] .INFO =空&& H->細胞[NewPos] .DATA =!キー) 61 { 62 ++ CNUM。 63 INTフラグ= 0 。 64 NewPos = CurPos CNUM * + CNUM。 65 であれば(CNUM> = H-> TableSize) 66 リターン - 1 。 67 一方(NewPos> = H-> TableSize) 68 NewPos - = H-> TableSize。 69 } 70 リターンNewPos。 71 } 72 73 INT 挿入(ハッシュテーブルH、キーのElementType) 74 { 75 INT順位= 検索(H、KEY)。 76 であれば(順位== - 1 ) 77 リターン -1 ; 78 であれば(H->細胞[順位] .INFO =!正当な) 79 { 80 H->細胞[順位] .DATA = キー。 81 [順位] .INFOは= H->細胞正当。 82 } 83 リターン順位。 84 } 85 86 のint main()の 87 { 88 INT M、N。 89 のscanf(" %D%D "、&M、&N)。 90 ハッシュテーブルH = CreateHashTable(M)。 91 INT I; 92 ための式(I = 0、I <N- 1は、I ++ ) 93 { 94 のint numが。 95 のscanf(" %dの"、およびNUM)。 96 INT順位= インサート(H、NUM)。 97 であれば(順位=! - 1 ) 98 のprintf(" %dの" 、POS)。 99 他の 100 のprintf(" - " ); 101 } 102 のint NUM。 103 scanf関数(" %のD "、&NUM)。 104 INT順位= インサート(H、NUM)。 105 であれば(順位=! - 1 ) 106 のprintf(" %dの" 、POS)。 107 他の 108 のprintf(" - " ); 109 戻り 0 ; 110 }