n個人在一起做遊戲,他們制定了一下規則:
1、首先,所有參加遊戲的人按順序編號為1、2、3…n; 2、接下來每個人心裡產生乙個數字,這個數字稱為序號為 n的人的密碼p; 3、所有參加遊戲的人按照編號站成乙個圈,為遊戲設定初始密碼k,從編
號為 1的人這裡開始報數,報到 k的人退出隊伍,然後將自己心中的密碼 k2說出
來,由下乙個人繼續從 1開始報數,報到 k2的人退出隊伍,以此類推;
4、當只剩下乙個人時,遊戲結束。
在使用者輸入了人數n、每個人的密碼p和初始
密碼k的情況下,自動完成上面的遊戲過程,輸出先後離開隊伍的人的序號序列,最後輸出剩下的人的編號
問題描述
輸入:
人數n(規定最大人數為100)
每個人的密碼key
初始密碼k
輸出:
先後離去的人的編號numno
最後剩下的人的編號numno
處理過程:
提示並儲存使用者輸入的人的總數n
提示並儲存使用者輸入的初始密碼k
提示並儲存使用者輸入的每乙個人的密碼key
遍歷使用者儲存的人的密碼的同時計數器自增
滿足條件時進行相關操作,輸出離開的人的編號
迴圈退出後輸出最後剩下的人的編號
退出程式
流程設計
模組介紹
儲存:
採用int型別的值儲存人數n,初始密碼k
採用結構體陣列儲存每個人的編號personno、密碼
personkey和未離開的人數personnum
實現:
迴圈遍歷陣列的每個元素,符合條件的元素輸出,直
至陣列中只有乙個有效元素,再輸出這個元素
源**
#include
#define num_max 100
using
namespace std;
//用結構體陣列存放參與遊戲的人的資訊
struct personperson;
intmain()
//根據使用者輸入的資訊初始化結構體陣列
for(
;i < n;i ++)
person.personnum = n;
//接受使用者輸入的初始密碼
cout <<
"please input the primitive key:"
<< endl;
cin >> k;
int counts =1;
i =0;
//剩下一人時退出迴圈
while
(person.personnum !=1)
//報的號碼與密碼不一樣並且此人還未退出遊戲時,繼續報數
else
if(person.personno[i]!=0
)//控制報數迴圈進行
i =(i +1)
% n;
} i =0;
//依據標誌判斷此人是否是最後剩下的人
for(
;i < n;i ++)}
return0;
}
測試樣例
1.personnum最小值:
3.用例1:
用例2:
用例3:
源**
#include #include using namespace std;
//指標節點結構體陣列
typedef struct linknodenode,*link;
//建立雙向的課迴圈的鍊錶
link createlink(int n)
//雙迴圈鍊錶
h->next->pre = r;
//迴圈結束後,返回這個鍊錶的頭指標h即可
return h;
}int main()
cout << "the no of person's left: " << p->personno << endl;
k = p ->personkey;
node* s = p;
s ->pre ->next = s->next;
s ->next ->pre = s->pre;
//最後釋放被刪除節點的空間就行
free(s);
counts = 1;
n --;
}else
counts ++;
p = p ->next;
}cout << "the last one:" << t ->personno << endl;
return 0;
}
我的部落格 約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫環問題
約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...