7-34 猴子選大王 (20分)
一群猴子要選新猴王。新猴王的選擇方法是:讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?
輸入在一行中給乙個正整數n(≤1000)。
在一行中輸出當選猴王的編號。
11
7
此題我用了三種方法,當然第三種最好,第一種就是利用陣列來標記在內還是不在內的,好處是一眼就能看懂,壞處是跟這個n有關,如果n太大就。。。
第二種是利用鍊錶 其實和陣列大致相同只不過要找到被刪除的前乙個,這樣方便刪除,直到最後乙個為止。
第三種辦法是最優解,只不過這題的n最大的時候也太小,顯現不出來。他實質上是將每次編號重拍 然後最後剩下的編號一定為0 反推回來 最好不要用遞迴
因為如果遞迴深度過大,會系統棧益出。
#include
#include
#include
typedef struct lnode
lnode ;
//約瑟夫環經典問題
//陣列標記法
int arr(int n,int m) }
}printf("%d\n",(i-1+n)%n+1);
} //鍊錶
int clnode(int n,int m)
p->next=l->next;
free(l);
while(p!=p->next)
s=p->next;
p->next=s->next;
free(s);
}printf("%d\n",p->data);
return 1;
}int ysf(int n,int m) //最有解 將每次編號重拍 然後最後剩下的編號一定為0 反推回來 最好不要用遞迴
int main()
7 34 猴子選大王 20分
一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?輸入在一行中給乙個正整數n 10...
5 28 猴子選大王 20分
5 28 猴子選大王 20分 一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?輸...
7 28 猴子選大王(20 分)
7 28 猴子選大王 20 分 一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?...