n個人(編號為1,2,3,……,n (n>0) )按順時針方向圍坐一圈,每人持有一個正整數密碼。開始時任意給出兩個值:一個為首先報數的人的編號i (0<i<=n),另一個為起始報數上限值m。接著從編號為i的人開始按順時針方向自1起順序報數,報到m時停止報數,且報到m的人出列,并將他的密碼作為新的m值,從他在順時針方向上的下一個人起重新自1報數,……,如此下去,直到所有人全部出列為止。要求設計一個程式模擬此程序,給出出列人的編號序列。
uj5u.com熱心網友回復:
可以用鏈表來實作uj5u.com熱心網友回復:
正整數密碼是隨機值還是事先給定的?用陣列或鏈表模擬就可以。uj5u.com熱心網友回復:
1)人數n、每人的正整數密碼、首次報數人編號i、初始報數上限值m均由鍵盤輸入。2)分別用順序存盤結構和鏈式存盤結構實作約瑟夫環問題
uj5u.com熱心網友回復:
大佬 可以給一下代碼嗎uj5u.com熱心網友回復:
請參考《C++自定義鏈表實作約瑟夫環(2-1)》
《C++自定義鏈表實作約瑟夫環(2-2)》
希望能夠幫到你!
uj5u.com熱心網友回復:
簡單寫段用動態陣列模擬的代碼,LZ可以參考一下特例:每個人的密碼都是m,且開始位置 i 為1就是原始的約瑟夫環問題
typedef struct {
int value;
int key;
} Circle;
int main() {
int n,i,m,cnt,idx=0;
printf("請輸入總人數n:");
scanf("%d", &n);
Circle *c = (Circle*)malloc(sizeof(Circle)*n); //申請記憶體,動態陣列
for(i=0;i<n;i++) {
c[i].value = 1; //0表示出局,1表示游戲中
printf("請輸入第%d個人的密碼:", i+1);
scanf("%d", &c[i].key);
}
printf("請輸入開始位置i(0<i<=n):");
scanf("%d", &i);
i--; //陣列下標是位置-1
printf("請輸入開始報數上限m:");
scanf("%d", &m);
cnt = n; //總游戲人數
while (cnt>1) {
if (c[i].value=https://bbs.csdn.net/topics/=1) {
idx++;
}
if (idx==m) {
cnt--; //游戲人數減1
c[i].value = 0; //出局
m = c[i].key; //更新m為出局者的密碼
printf("第%d個出列者編碼:%d\n", n-cnt, (i+1));
idx = 0;
}
i++; //i位置遞增
if (i==n) i=0; //如果位置到圈尾則從頭開始
}
for (;c[i].value=https://bbs.csdn.net/topics/=0;i=(i+1)%n); //找到最后一個沒出局的人
printf("最后一個出列者編號:%d\n", i+1);
free(c); //釋放記憶體
return 0;
}
uj5u.com熱心網友回復:
謝謝!轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61563.html
標籤:C++ 語言
上一篇:大神求教
