第二次上机作业(4)
//数学方法
约瑟夫问题:n个人围成一个圈,从1开始顺序编号,游戏开始,给定1-n区间内一数m,从第一个人开始报数,报到m的人退到圈外,问最后胜利的人的初始编号。
题目分析:若想知最后胜利的人编号,则仅需知最后一个出圈的人,若要知最后一个出圈的人的编号,则需知倒数第二个出圈的人的编号,类推得到下列表达式
f[i]=(f[i-1]+m)%i
故可简化约瑟夫问题为
#include
using namespace std;
int main(){
int n, m, s = 0;
cin >> n >> m;
for (int i = 1; i < n; i++)
s = (s + m) % i;
cout << s+1+m << endl;
return 0;
}
版权声明:本文为qq_51719952原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。