Input:
包含多組數據。
每行表示初始人數n。<n<1000000)< p="">
最后一組是0,不用處理。
Output: 對每個測試數據輸出最后一人的初始編號
Sample Input:
3 7 0
Sample Output:
2 4
代碼:
1、這是最簡單的版本,但是難以理解
#include<stdio.h> int main() { int i,n; while(scanf("%d",&n)!=EOF) { if(n==0)break; int f=0; for(i=2;i<=n;i++) { f=(f+3)%i; } printf("%d\n",f+1); } }
2、這是簡單易懂的版本
#include<stdio.h> void main() { int i,n; while(scanf("%d",&n) != EOF) { if(n==0) break; int a[1000],p=0,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個數,數到3就少一個數,為判定減到最后一個數准備 } if(q==1) break;//當剩下最后一個就輸出 } for(i=0;i<n;i++) { if(a[i] != 0) printf("%d\n",a[i]); } }