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]);
}
}
