今天在看雪看到這個“貓吃老鼠問題”的帖子,和當初學編程時的一個叫做“約瑟夫環問題”類似。
自己按照數學的方法分析了一下,得到一個數學算法。
問題描述:
現有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);
若從任意號算起,只要在此基礎上加入一個計算偏移量的代碼即可。
分析圖示:
1 | ||||||||||||||||
1:01 | 1 | |||||||||||||||
2:02 | 1 | 2 | ||||||||||||||
2 | ||||||||||||||||
3:02 | 1 | 2 | 3 | |||||||||||||
2 | ||||||||||||||||
4:04 | 1 | 2 | 3 | 4 | ||||||||||||
2 | 4 | |||||||||||||||
4 | ||||||||||||||||
5:02 | 1 | 2 | 3 | 4 | 5 | |||||||||||
2 | 4 | |||||||||||||||
2 | ||||||||||||||||
6:04 | 1 | 2 | 3 | 4 | 5 | 6 | ||||||||||
2 | 4 | 6 | ||||||||||||||
4 | ||||||||||||||||
7:06 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |||||||||
2 | 4 | 6 | ||||||||||||||
2 | 6 | |||||||||||||||
6 | ||||||||||||||||
8:08 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||||||||
2 | 4 | 6 | 8 | |||||||||||||
4 | 8 | |||||||||||||||
8 | ||||||||||||||||
9:02 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |||||||
2 | 4 | 6 | 8 | |||||||||||||
2 | 6 | |||||||||||||||
2 | ||||||||||||||||
10:04 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ||||||
2 | 4 | 6 | 8 | 10 | ||||||||||||
4 | 8 | |||||||||||||||
4 | ||||||||||||||||
11:06 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||||
2 | 4 | 6 | 8 | 10 | ||||||||||||
2 | 6 | 10 | ||||||||||||||
6 | ||||||||||||||||
12:08 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ||||
2 | 4 | 6 | 8 | 10 | 12 | |||||||||||
4 | 8 | 12 | ||||||||||||||
8 | ||||||||||||||||
13:10 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
2 | 4 | 6 | 8 | 10 | 12 | |||||||||||
2 | 6 | 10 | ||||||||||||||
2 | 10 | |||||||||||||||
10 | ||||||||||||||||
14:12 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | ||
2 | 4 | 6 | 8 | 10 | 12 | 14 | ||||||||||
4 | 8 | 12 | ||||||||||||||
4 | 12 | |||||||||||||||
12 | ||||||||||||||||
15:14 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
2 | 4 | 6 | 8 | 10 | 12 | 14 | ||||||||||
2 | 6 | 10 | 14 | |||||||||||||
6 | 14 | |||||||||||||||
14 | ||||||||||||||||
16:16 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | |||||||||
4 | 8 | 12 | 16 | |||||||||||||
8 | 16 | |||||||||||||||
16 |