您的位置:首页 > 其它

ZOJ 1088 System Overload (约瑟夫问题通用公式)

2010-07-28 15:06 423 查看
数学啊,数学。

具体过程在《具体数学》80页,是在3.4 floor/ceiling recurrence一节中讲的,具体的算法在81页表示了出来。网上又更简单的函数,但是基本思路有一些相像。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int Josephus(int n,int q)//n是个数,q是每q个排除一个
{
int D,m,t;
t = (q-1)*n;
for(D = 1;D <= t;)
{
m=q*D;
D=m/(q-1);
if(m%(q-1) == 0) continue;
else D++;
}
return q*n+1-D;
}
/×int Josephus1(int n, int m)//这个是网上的代码,但是结果需要加一
{
if (n==1)
{
return 0;
}
return (Josephus1(n-1,m)+m)%n;
}×/
int main()
{
int i,n;
while( cin >> n && n)
{
for(i = 2;;i++)
if(Josephus(n-1,i) == 1) //这里用n-1的原因是第一个已经被去掉了。。。
{
cout << i << endl;
break;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: