今天在看雪看到這個「貓吃老鼠問題」的帖子,和當初學程式設計時的乙個叫做「約瑟夫環問題」類似。
自己按照數學的方法分析了一下,得到乙個數學演算法。
問題描述:
現有n個老鼠圍成一圓圈,有乙隻貓從任意位置開始吃老鼠,每次都隔乙個老鼠吃,請給出最後乙個老鼠的編號?題目要求是任給老鼠數n,輸出貓最後吃的老鼠的編號。
數學演算法
//若從1號算起
int total = 1;
int seed = 1;
printf("老鼠個數?/n");
scanf("%d",&total);
while(seed < total) seed<<=1;
printf("最後乙個吃掉的是:%d/n",2*total-seed);
若從任意號算起,只要在此基礎上加入乙個計算偏移量的**即可。
分析圖示:
11:01
12:0212
23:0212
324:0412
3424
45:0212
3452
426:0412
3456
2464
7:0612
3456
7246
2668:0812
3456
7824
6848
89:0212
3456
7892
4682
6210:0412
3456
78910
2468
10484
11:0612
3456
78910
11246
81026
10612:0812
3456
78910
111224
68101248
12813:1012
3456
78910
1112132
46810
122610
2101014:1212
3456
78910
1112
131424
681012144
812412
1215:1412
3456
78910
1112
1314152
46810
121426
1014614
1416:1612
3456
78910
1112
1314
151624
681012
141648
1216816
16
貓吃老鼠演算法
曾經一道面試題,大概意思是 有乙隻很強大的貓咪,喜歡把抓來的n只老鼠們排成乙個佇列,然後設乙個步長值k,先吃掉第一隻後,再每隔k只再吃,吃完一輪後再按上面規則重新開始下一輪,直到剩下最後乙隻老鼠為止,貓咪為了保持生態平衡就放了這只老鼠 有只老鼠很聰明,他能很準確的計算出最後放生的位置,請用程式寫出來...
貓捉老鼠問題系列(一)
形象化的數學問題,總是引人入勝,這個世界創意還是很重要的。從網上收集了一些貓和老鼠的數學話題,僅供欣賞之。在數軸上,0的位置停著乙個不動的老鼠,1的位置在初始時刻有乙隻貓。貓是可以走動的,每一步在數軸上分別以二分之一的概率或朝著正方向或朝著負方向走1的距離。當貓到達0的位置時,貓就抓到老鼠了,遊戲結...
貓捉老鼠問題系列(四)
從有限到無限,似乎是乙個無法逾越的鴻溝,需要思維的跨越。數學中引入極限概念,實現有限和無限的連線,而極限概念更聯絡著許多知名的悖論,如芝諾悖論,旅館悖論等等。可以說有限和無限的秘密,將是乙個永恆的話題。本章與極限雖無直接關係,但仍可據此浮想聯翩。乙隻貓發現離它10步遠的前方有乙隻老鼠在奔跑,便哈腰緊...