m個人圍成一圈123迴圈報數報到3的人退出並

時間 2021-06-17 07:28:26

1樓:

此題可用數學方法求解。

設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數  (用數學方法解的時候需要注意應當從0開始編號,因為取餘會取到0解。)

實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關係式。

假設除去第k個人,則

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)

0, 1, 2, 3, ..., k-2,      , k, ..., n-1        // 除去第k人,即除去序號為k-1的人   (2)

k, k+1, ..., n-1,    0,    1,        ..., k-2  // 以序號k為起始,從k開始報0  (3)

0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2   // 作編號轉換,此時佇列為n-1人  (4)

變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看

出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2,

對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k,  (1+k)%n=k+1,  故可得出規律:

設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.

設x為最終留下的人序號時,佇列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。

#include

const int m = 3;

int main()

2樓:匿名使用者

#include

int fun(int n ,int *p);int i,j;

int t1,t2;

for(i=0;i

*p=arr1[2];

p++;

for(j=0;j

arr1[n-3-j]=t1;

arr1[n-2-j]=t2;

*p=arr1[2];

p++;

}*p=arr1[0];

p++;

*p=arr1[1];

return *p;

}void main()

m個人圍成一圈,1,2,3迴圈報數,報到3的人退出,函式int fun(int n ,int *p)實現上述功能。··怎麼做??

3樓:匿名使用者

#include

int fun(int n ,int *p);int i,j;

int t1,t2;

for(i=0;i

*p=arr1[2];

p++;

for(j=0;j

arr1[n-3-j]=t1;

arr1[n-2-j]=t2;

*p=arr1[2];

p++;

} *p=arr1[0];

p++;

*p=arr1[1];

return *p;

}void main()

4樓:秋楓

int fun(int n ,int *p)}j++;

if(j==n)

j=0;

if(k==n)

break;

}return p[n-1];}

c語言編寫n個人圍成一圈,按1、2、3報數,報到3的人退出,求最後留在圈中的人是最初n個人中的第幾個(用指

5樓:匿名使用者

此題可用數學方法求解。

設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數    (用數學方法解的時候需要注意應當從0開始編號,因為取餘會取到0解。)

實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關係式。

假設除去第k個人,則

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)

0, 1, 2, 3, ..., k-2,      , k, ..., n-1        // 除去第k人,即除去序號為k-1的人   (2)

k, k+1, ..., n-1,    0,    1,        ..., k-2  // 以序號k為起始,從k開始報0  (3)

0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2   // 作編號轉換,此時佇列為n-1人  (4)

變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,

((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k,  (1+k)%n=k+1,  故可得出規律:

設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.

設x為最終留下的人序號時,佇列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。

#include

const int m = 3;

int main()

6樓:手機使用者

以前做過的,貼一個給你,人數和報的數都可以輸入的 #include#include//應用函式呼叫來實現

void fun_kill(int *pa,int n,int m)i=0;int mcount=0;

int icount=0;

while(icount人數小於總人數if(mcount==m)i++;//報數的同時指標也開始走動if(i==n)}for(i=0;i

scanf("%d",&n);

printf("請輸入要報的數:");

scanf("%d",&m);

int *pkill=(int *)malloc(sizeof(int)*n);

fun_kill(pkill,n,m);

c語言程式設計:有n個人圍成一圈,按順序從1到n編號。從第一個人開始,報到3的人退出圈子。

7樓:凌亂心扉

#include

int main(int argc,char*argv);printf("請輸入有幾個人玩遊戲:");

scanf("%d",&n);

for(i=0;i

for(i=1;i<4;i=i%3+1)//控制i的值在[0,3]if(0==a[j])

j=(j+1)%n;

}for(i=0;i}

8樓:滄海雄風

#include

struct serial

;void main()

q->next =p->next ;

printf("被刪除的元素:%-4d\n",p->num);

p=q->next ;

}printf("\n最後報號出來的是原來的:%d\n",p->num);}8

被刪除的元素:3

被刪除的元素:6

被刪除的元素:1

被刪除的元素:5

被刪除的元素:2

被刪除的元素:8

被刪除的元素:4

最後報號出來的是原來的:7

press any key to continue

9樓:匿名使用者

此題可用數學方法求解。

設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數  (用數學方法解的時候需要注意應當從0開始編號,因為取餘會取到0解。)

實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關係式。

假設除去第k個人,則

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)

0, 1, 2, 3, ..., k-2,      , k, ..., n-1        // 除去第k人,即除去序號為k-1的人   (2)

k, k+1, ..., n-1,    0,    1,        ..., k-2  // 以序號k為起始,從k開始報0  (3)

0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2   // 作編號轉換,此時佇列為n-1人  (4)

變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2,

對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k,  (1+k)%n=k+1,  故可得出規律:

設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.

設x為最終留下的人序號時,佇列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。

#include

const int m = 3;

int main()

return 0;}

10樓:餘啊水中游啊遊

這是約瑟夫環問題。

#include

#define m 43/*總人數*/

#define n 3

#define start 0/*第一個報數的人*/void main(void)

getch();}

11樓:小翼

經典約瑟夫環問題:

// n個人(1..n)圍成一圈,從m開始報數,增量為k// 返回最後一個人的編號,o(n)複雜度;

int josephus(int n,int k,int m)

12樓:匿名使用者

請問這個n有取值範圍嗎?

目前我有兩種思路,一種簡單的方式是用長度為n的陣列記錄,初始化為1,當計數到3是把對應的陣列下標輸出,並賦值為0.依次重複直到只剩下一個1.

第二種還是我的初步構想,找出退出的規律,可能可以用遞迴到n=1的情況。

13樓:華慧

我也不知道 等別人回答吧

蛇身是一圈白一圈黑的是什麼蛇,有一種蛇一圈黑一圈黃的是什麼蛇

無毒的白環或者棺材頭三角形脊椎的銀環 劇毒,還有黑白王蛇就是樓下那張圖 無毒 剛剛遇到蛇了,蛇身是黑色的,但有一圈圈白環,這是什麼蛇 貝克街流浪貓 銀環蛇或白環蛇 無圖無真相 春 銀環蛇,白天不容易看到 黑白相間的話是銀環蛇 有一種蛇一圈黑一圈黃的是什麼蛇? 漫隨流水 金環蛇金環蛇 學名 copy ...

肩膀上起了很多紅色的疹子一圈一圈的起

劉肖凱 我是北方的,原本自我感覺身強體壯的,但是一到南方,氣候潮溼,起了溼疹,剛開始是塗了皮炎平就好了。我的身體還容易過敏,現在還是時有發癢。我用的是糠酸莫米鬆軟膏。不知道是否適合於你。我們有些症狀類似,但是我的是過敏了。而且也沒有你所說是中間好了外圍還是癢這樣的情況。我打針吃藥一個多月,歷盡病痛的...

地球自轉一圈是多少天,請問地球自轉一圈準確的時間是多少

地球自轉一圈就是一天,即所說的太陽日,地球轉一圈需要23小時56分4.09秒。誰都知道,地球公轉一週稱一年,有365日5小時48分46秒 一天有23小時56分4.09秒,這是一個太陽日.恆星日總是比真太陽日要短一些。這是因為地球離恆星非常遙遠,遠到從恆星上看來,地球似乎是不動的,地球的公轉軌道相對於...