有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。


這一道題,在剛學完指針之后的第一個禮拜,無意間看到課后練習,就去思考,起先不會做,想了很久,只有一點思路,但是還是不能把代碼完整的寫出來,后來就去百度,看了貼吧,發現這是經典問題了,俗名猴子選大王,發現很多種方法,我就挑其中的一種符合我這種初學者的方法,不過貼吧沒有注釋,一開始不理解,估計也有很多跟我一樣剛開始不理解的,晚上睡覺的時候想了許久,便理解了一點,這邊分享一下我的理解:

#include<stdio.h> 
main() 
{ 
int a[100]; 
int i,n,p=0,q; 
printf("input number:"); 
scanf("%d",&n); 
q=n; 
for(i=0;i<n;i++) a[i]=i+1; 
for(i=0;;i++) 
 { 
 if(i==n) i=0; //當i++一直到n時,肯定有一些沒有被選到,比如我們輸入8,第一輪是3,6被賦值0,當i=8時,繼續下一輪//
 if(a[i]!=0) p++;//我們下面定義的是當循環到三時,就賦值0,所以這邊等0的不考慮在內// 
 else continue; 
 if(p%3==0)//這個就是從0一直加,到三的倍數就賦值為0,從而就達到我們的目的//
  {a[i]=0;q--;} //上面q=n;表明q==n,只有一個為0就減一,為下面做鋪墊//
 if(q==1) break; //當剩下最后一個就輸出//
 } 
for(i=0;i<n;i++) 
if(a[i]!=0) 
printf("spare: %d\n\n",a[i]); 
}

這樣就可以運行了。這只是其中一種比較適合初學者,還有幾種,這邊分享給你們:

#include<iostream>  
  
using namespace std;  
  
int main()  
{  
    int num[50];  
  
    int i,j,k,m,n;  
  
    int *p;  
  
    cout<<endl<<"請輸入總人數:"<<endl;  
  
    cin>>n;  
  
    p=num;  
  
    for(i=0;i<n;i++)  
    {  
        *(p+i)=i+1;   //以1至n為序,給每個人編號  
    }  
  
    i=0;    //i為每次循環時計數變量  
  
    k=0;    //k為按1 2 3報數時的計數變量  
  
    m=0;    //m為退出人數  
  
    while(m<n-1)  //當退出人數比n-1少時(即未退出人數大於1時)執行循環體  
    {  
        if(*(p+i)!=0)  
        {  
            k++;  
        }  
  
        if(k==3)    //將退出人的編號置為0  
        {  
            *(p+i)=0;  
  
            k=0;  
  
            m++;  
        }  
  
        i++;  
  
        if(i==n)  
        {  
            i=0;//報數到尾后i恢復為0  
        }  
    }  
  
    while(*p==0)  
    {  
        p++;  
    }  
  
    cout<<"最后一個是"<<*p<<" 號!"<<endl;  
  
    return 0;  
}  

還有一種比較叼的:

#include <stdio.h> 

 int M = 3; 

int main() 
{ 
    int n, s = 0; 
    scanf("%d", &n); 
    for (int i = 2; i <= n; ++i) 
        s = (s+M)%i; 
    printf("%d\n", s+1); 
    return 0; 
}

這個目前還看不懂,代碼如此之少。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 報數問題:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 約瑟夫環問題:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有10個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是第幾號的人 python 實現:題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來的第幾號的那位。 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM