1078ハッシュ(25分)

この問題のタスクは簡単である:入力番号の位置をハッシュテーブルに異なる正の整数の配列を挿入し、出力します。ハッシュ関数は、と定義される  場合(  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 }
コードの表示

おすすめ

転載: www.cnblogs.com/57one/p/12071432.html