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