数学啊,数学。 具体过程在《具体数学》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; }