pta **聊天狂人(25 分)
給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。
輸入首先給出正整數n(≤105),為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。
在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。如果這樣的人不唯一,則輸出狂人中最小的號碼及其通話次數,並且附加給出並列狂人的人數。
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
思路分析:
本題要找通話次數最多的號碼,如果這樣的號碼不唯一,就找最小的號碼,想到用雜湊表進行儲存。
**如下:
1view code//本題採用除留取餘法構造雜湊函式,使用分離鍊錶法解決衝突
23 #include 4 #include 5 #include 6 #include 7
8using
namespace
std;
910 typedef char elementtype[keylength+1]; /*
*/11 typedef int index; /*
雜湊位址型別
*/12
13#define maxtablesize 1000000
1415 typedef struct lnode *ptrtolnode;
16struct
lnode17;
22typedef ptrtolnode position;
23typedef ptrtolnode list;
2425 typedef struct tblnode *hashtable; /*
雜湊表型別
*/26
struct tblnode /*
雜湊表結點定義
*/27;31
32 index hash(int k, int tablesize ) //
雜湊函式
3336
37int nextprime(int n) //
選取乙個產生衝突較少的素數,作為表長
3848
if(i*i>j)
49return
j;50
else
51 j+=2; //
素數每次加2,減少迴圈次數52}
53}54position find(hashtable h,elementtype key,index k)
5561
return
p;62}63
void
insert(hashtable h,elementtype key)
6470 index k=hash(sum,h->tablesize);
71 position p=find(h,key,k);
72if(!p)
7383
else
84 p->cnt++;85}
86 hashtable buildtable(int
m)87
100return
h;101
}102
103int
main()
104115
//cout<
int maxnum=0
;117
int ans=0
;118
for(int i=0; itablesize; i++)
119129
else
if(p->cnt==maxnum)
130135 p=p->next;
136}
137//
cout<
}139
//cout<
%s %d
",key,maxnum);
141if(ans>1
)142 printf("%d"
,ans);
143 printf("\n"
);144
return0;
145}
146147
/*148
4149
13005711862 13588625832
15013005711862 13088625832
15113588625832 18087925832
15213005711862 13588625832
153154
*/
堅持不懈地努力才能成為大神!
資料結構 雜湊表(除留取餘法 鏈位址法)
include using namespace std 雜湊函式的構造方法 除留取餘法 typedef struct node node typedef struct hash table hash table 初始化雜湊表 hash table inithashtable 在雜湊表中查詢資料 no...
雜湊表除留取餘法的桶個數為什麼是質數
可先科普下質數的概念 質數,也就是素數,就是指乙個大於1的自然數,約數 因數 只有1和它自己,否則叫合數。除留取餘,就是雜湊函式將關鍵字被某個不大於雜湊表長m的數p除后所得餘數為雜湊位址。這是最常用 也最簡單的構造雜湊函式的方法。當然,也可以對關鍵字直接取模,也可以摺疊 平方取中等運算後取模。那麼問...
除2取餘法
要求 給乙個十進位制數n,求出n二進位制各個數字的和 方法 除以2取餘法,將值相加即可 include using namespace std intmain cout ans endl return0 eg 6 110,有2個1 1023 1111111111,有10個1。如果把每位的數值做標記 ...