约瑟夫环(约瑟夫问题)
是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题的解。
递推公式f[1] = 0, f[i] = (f[i-1] + K) % i
f[i]是有i个数时最后剩下的那个人的下标
#include <iostream>using namespace std;int main(){int m,n,i;cin>>n>>m;int a1=0;//a1:只有一个人时,下标为零,标号为i+1=1,所以说剩下那个人标号是1for(i=2;i<=n;++i){a1=(a1+m)%i;//cout<<a1+1<<endl;//这里输出的是有i个数时最后剩下的那个人的标号(一开始从1到n的标号)}return 0;
}
例题
题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入
输入两个整数n和m,1<=m<=n<=100。
输出
输出猴王的编号
样例输入
8 3
样例输出
7
#include <iostream>using namespace std;int main(){int m,n,i;cin>>n>>m;int a1=0;for(i=2;i<=n;++i){a1=(a1+m)%i;}cout<<a1+1<<endl;return 0;
}