ZOJ1088
题意:
近期,你有个经验,当很多人使用BBS的时候,速度会变的很慢。程序用于解决这个问题以求达到公平。
n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
输入:
输入n个人和报数的m,要求输出最后胜利的组编号。
输出:
思路:
我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2
并且从k开始报0。
代码:
#include<stdio.h>
int m;
int n;
int check() //递推式
{
int r=0;
for(int i=2; i<n; i++)
r = (r+m)%i;
if(r==0)
return 1;
else
return 0;
}
int main()
{
while(scanf("%d",&n)&& n!=0)
{
m=1;
while(!check())
m++;
printf("%d\n",m);
}
return 0;
}
对网上代码表示没看懂
自己写的:
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)&&n){
int m=2;
int flag=1;
n--;
while(flag)
{
int t=n;
int x=0;
flag=0;
while(t>1)
{
x=(x+m-1)%t;
t--;
if(x==0)flag=1;
// printf(" %d %d\n",x,m);
// getchar();
}
m++;
}
printf("%d\n",m-1);
}
return 0;
}