圓圈迴圈報數

來源:互聯網
上載者:User

1.問題提出
有100個小朋友按編號順序1,2,。。。,100逆時針方向圍成一圈。從1號開始逆時針方向1,2,。。。,9報數,凡報數9者出列(顯然,第一個出圈為編號9者)。
最後剩下一個未出圈者的編號是多少?第50個出圈者的編號是多少?

 

2.設計要點
圓圈迴圈報數問題稱為Joseph問題。我們考慮一般問題:有n個小朋友按編號順序1,2,。。。,n逆時針方向圍成一圈。從1號開始按逆時針1,2,。。。,m報數,凡報數m者出列。
求最後剩下一個未出圈者的編號與指定第p個出圈者的編號。
設定數組a(n),每一數組元素賦初值1,每報一人,和變數s增1。當加a(i)後和變數s的值為m時,a(i)=0,標誌編程為i者出圈,設定ln統計出圈人數。同時,s=0並重新逆時針方向後報數累加。
當出圈人數ln為指定的p時,x=i,x即為第p個出圈者的編號。
當出圈人數ln達到n-1時,即未出圈者只剩1人,終止報數,列印最後剩下者的編號。

 

3.代碼實現
#include "stdafx.h"</p><p>int main(void)<br />{<br />int ln, x, s, i, n, m, p;<br />static int a[200];</p><p>printf("編號1,2,。。。,n的n個人逆時針依次圍成一圈,從1開始,/n");<br />printf("逆時針1,2,3,。。。,m報數,凡m的倍數者出圈。/n");<br />printf("求最後一個未出列者與第p個出列者的編號。/n");<br />printf("請依次輸入n, m, p: ");<br />scanf("%d%d%d", &n, &m, &p);<br />for (i = 1; i <= n; i++)<br />a[i] = 1;<br />ln = 0; s = 0; x = 0; i = 0;<br />while (ln < n - 1)<br />{<br />i++;<br />if (i > n)<br />i = 1;// 一圈報完接著下一圈<br />s += a[i];// 按逆時針順序報數<br />if (s == m)// 報到指定的m者出圈賦x<br />{<br />a[i] = 0;<br />s = 0;<br />ln++;<br />}<br />if (ln == p && !x)// 第p個出圈者i號賦給x<br />x = i;<br />}</p><p>printf("報數最後剩下一個人編號為:");<br />for (i = 1; i <= n; i++)<br />if (a[i])<br />printf("%d ", i);<br />printf("/n第%d個出列者編號是:%d號/n", p, x);</p><p>return 0;<br />}

 

4.  用數組元素表示人的編號,每次出列者從從數組中刪去,未出列在數組中重新置放。每報一輪數後,人的總數n將減少,至n=1時報數終止。

 

5.  代碼

#include "stdafx.h"</p><p>int main(void)<br />{<br />int ln, x, k, s, t, i, n, m, p;<br />static int a[200];</p><p>printf("編號1,2,。。。,n的n個人逆時針依次圍成一圈,從1開始,/n");<br />printf("逆時針1,2,3,。。。,m報數,凡m的倍數者出圈。/n");<br />printf("求最後一個未出列者與第p個出列者的編號。/n");<br />printf("請依次輸入n, m, p: ");<br />scanf("%d%d%d", &n, &m, &p);<br />for (i = 0; i < n; i++)<br />a[i] = i + 1;<br />k = 1; ln = 0;</p><p>while (n > 1)<br />{<br />t = 0;<br />for (i = 0; i < n; i++, k++)<br />{<br />if (k != m)<br />a[t++] = a[i];// 未出列者在數組中重新置放<br />else<br />{<br />k = 0;<br />ln++;<br />if (ln == p)<br />x = a[i];<br />}<br />}<br />n = t;<br />}</p><p>printf("報數最後一個人編號為:%d/n", a[0]);<br />printf("第%d個出列者編號是:%d號/n", p, x);</p><p>return 0;<br />}

 

 

轉自《趣味C程式設計》

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.