约瑟夫环问题的输出结果是多少?

100人一圈,从第一个开始,第隔10人退出一个,从下个开始,求最后一个人的位置

对于n个数字(0,1,2.....n-1)排成一圈,每次删除第m个数字的情况,有递推公式:

则根据这个公式,实现的代码为:

#include<iostream>
using namespace std;
int LastRemaining(unsigned int n, unsigned int m)
{
    if (n < 1 || m < 1)
        return -1;
    int last = 0;
    for (int i = 2; i <= n; i++)
        last = (last + m) % i;
    return last;
}
int main()
{
unsigned int m, n;
cin >> n >> m;
cout << "The last remaining number is " << LastRemaining(n, m) << endl;
return 0;
}

最后的结果为:

追问

哦哦,你回答得太好了

但是,你看看我的这个程序有没有问题,为什么我的结果是26呢?

追答

我感觉是
i=(i+1)%10;
这句造成的不一致。

从第一个删去的人来看,我删去的是a[9],而你删去的是a[10]。
到底应该删哪一个人??

追问

当然是删除第10个人啊,只不过用a[0]存第1个人,a[1]代表第二个,一直到a[99]代表第100个人
那么根据我的意思,是哪里错了?

追答

就是那块错了,你删的是第11个人,你读下你的程序,看第一次置零是哪一个

追问

哦哦哦,不好意思,其实我真实的意思是:
a[0]代表最后一个,a[1]代表第一个,然后就是分别是哪个元素就代表哪一个哦
你看看,那么还错了吗?

追答

那就没错,我的序号是0,1,.....n-1。你的序号是n,1,2,...n-1。
我的25指的是第26个人,你的26指的是第26个人。
咱俩的结果是一致的。

追问

嘻嘻,是的是的

温馨提示:内容为网友见解,仅供参考
无其他回答

约瑟夫问题
约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈 ,每人手持一个密码(正整数),开始任意选一个整数作为报数上限值,从第一 个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密 码作为新的m值,从他顺时针下一个人开始重新从1开始报数,如此...

JOSEPHUS 好人 求算法思路,最好有代码
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。 假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。 C++代码示例: ...

约瑟夫环(单向循环链表)_C语言「抄作业」
约瑟夫环问题 该问题求解Josephus与最后存活的另一人最初的位次。具体而言,当剩余人数为n时,从第一个人开始,每报数k次后,淘汰当前报数者,直到最后剩下2人。最终,Josephus与另一人分别位于第16和第31的位置上。示例输出 在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Joseph...

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

把1~1993个自然数按顺时针方向依次排列在一个圆圈上,从1开始顺时针的方...
对楼上的问题我表示怀疑,因为第一圈后剩下的是1、3、5、7.。。。,然后第二圈是1,然后是5,而5并不能被3整除。实际上这个问题是约瑟夫环问题,没有非常快的计算方式,数学方法如下:问题描述:n个人(编号0~(n-1)),从0开始报数,报到m-1的退出 ,剩下的人继续从0开始报数。求胜利者的...

约瑟夫环程序who用pascal写了?
约瑟夫问题:program p1(input,output);const maxn=1000;var ay:array[1..1000]of boolean;i,n,s,m,p,j:integer;begin readln(n,s,m);for i:=1 to n do ay[i]:=true;j:=0;i:=s;p:=1;while(j<n)do begin if p=m then begin ay[i]:=false;j:=j+1;p:=0;write(i,' ...

C++ 约瑟夫环问题
3. 输出出圈游戏一结果 4. 输出出圈游戏二结果 5. 退出 选择1,2时分别进行出圈游戏,且将结果保存在文件中,选择3,4时,在屏幕上输出相应结果 include <stdio.h> include <malloc.h> struct stu { int num;struct stu *next;};int m,n;struct stu *p,*q,*s;struct stu *create(){ s...

约瑟夫问题:n个人围成一圈,从第1个人开始数数,数到3的人出圈,输出出圈...
比较完整的 include<Windows.h> include<string.h> include<iostream> using namespace std;struct PERSON { int flag;int num;PERSON *pNext;};int g_iCount=0;void ArrayEatMouse(int a[],int count,int num){ int iLoop=0;int ExitNum=0;int iCount=0;while(ExitNum<count-1){ if(0...

C数组猴子选大王
\/ 结果:--- 猴子竞选大王 --请输入猴子的总数num = 10 按顺时针方向就坐的猴子编号依次是:猴子1 猴子2 猴子3 猴子4 猴子5 猴子6 猴子7 猴子8 猴子9 猴子10 规定数字,报出这个数的猴子将被淘汰出局,这个数max_hao = 2 被淘汰出局的猴子依次是:猴子2 猴子...

C++编程:约瑟夫环问题。
\/\/ 输出约瑟夫环 void print();\/\/ 开始处决犯人 void start();private:\/\/ 约瑟夫环的头指针 struct Prisoner * head;\/\/ 第一个被处决的犯人的节点指针 struct Prisoner * firstPunishedPrision;};JosephCircle::JosephCircle(int N,int S,int D){ struct Prisoner * p , *pr;\/\/ 约瑟夫环的...

相似回答