递推:约瑟夫环

约瑟夫环(约瑟夫问题)

是一个数学的应用问题:已知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,所以说剩下那个人标号是1
    for(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;
}

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/80721673