ACMNO.38 C語言-報數 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。
阿新 • • 發佈:2018-12-28
題目描述
有n人圍成一圈,順序排號。
從第1個人開始報數(從1到3報數),凡報到3的人退出圈子。`在這裡插入程式碼片`
問最後留下的是原來的第幾號的那位。
輸入
初始人數n
輸出
最後一人的初始編號
樣例輸入
3
樣例輸出
2
來源/分類
C語言
題目截圖:
思路:
這個程式碼使用比較簡單的方式來解決的。 不使用資料結構裡面的知識。 挺不錯的思想! quit_num=0;/*出圈人數*/ i=0;k=0; while(quit_num<n-1)/*直到只剩下1人時*/ { if(a[i]!=0)//這個是判斷已經出去過的人! k++;//來為K增加資料。 if(k==3)//當滿足題目中的數到第三個人的時候!進行下面的操作! { a[i]=0;//模擬這個人被踢出去的操作! quit_num++;//這個是判斷結束條件的~ k=0;//重置判斷條件,就是從0再開始增加。到3的時候,開始剔除人。 } i++;//這個是人數的推進! if(i==n)//這個挺重要的,這個到達最後的時候。代表第一圈迴圈結束啦。到達最後進行的操作! i=0;//沒有這個語句的話。就無法進入下一次迴圈! }
完整程式碼:
#include <iostream> using namespace std; int main() {int a[100000]={0},i,quit_num,k;int n; cin>>n; for(i=0;i<n;i++)/*陣列a存放原始編號*/ a[i]=i+1; quit_num=0;/*出圈人數*/ i=0;k=0; while(quit_num<n-1)/*直到只剩下1人時*/ { if(a[i]!=0) k++; if(k==3) { a[i]=0; quit_num++; k=0; } i++; if(i==n) i=0; } for(i=0;i<n;i++) if(a[i]!=0) printf("%d",a[i]); }
程式碼截圖:
執行結果:
OJ結果: