求这个约瑟夫环数学算法的具体原理!

问题很简单,N个人的约瑟夫环,报数“3”的人出列,求最后剩下的人。这个数学方法看不懂,请大神解释!谢谢!

#include <stdio.h>
#include <conio.h>
#define N 3
int numberOFf(int m);
int main()
{
int m;
puts("How much people are there in this queue: ");
scanf("%d", &m);
printf("The last people remaining is number %d!\n", numberOff(m));
getch();
return 0;
}
int numberOff(int m)
{
int i = 0, p, tmp;
while(++i <= m)
{
p = i * N;
while (p > m)
{
p = p - m + (p - m - 1) / (N - 1);
}
tmp = p;
}
return tmp;
}

第1个回答  2012-08-23
这不就是C语言么 好简单 原理就在程序里面
主要是这个公式
p = p - m + (p - m - 1) / (N - 1);追问

对啊,问的就是这个公式的数学原理

追答

余数原理拉 , 只要你验证这个公式对 你还要什么原理么?你就是个结论 你要证明么???
就根据与余数拉

本回答被网友采纳
第2个回答  2012-08-23
路过

约瑟夫环公式是怎样推导出来的?
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head。2、解决问题的核心步骤:1.建立一个具有n个链结点,无头结点的循环链表。2.确定第1个报数人的位置。3...

约瑟夫环的算法原理
约瑟夫环运作如下:1、一群人围在一起坐成 环状(如:N)2、从某个编号开始报数(如:K)3、数到某个数(如:M)的时候,此人出列,下一个人重新报数4、一直循环,直到所有人出列 ,约瑟夫环结束

约瑟夫环的问题求解
约瑟夫斯问题的核心是确定在n个人中,每隔m个人进行一次消减操作后,最后剩下的人的初始位置。例如,n=10时,先消去每隔2个人,剩余5个人,问题转化为在剩余的5个人中找出最后幸存者,以此类推。当m=2时,问题相对简单。以n=10为例,经过一轮消减后,问题规模变为一半,即在剩下的5个人中找出最后...

【生活处处皆算法】巧用约瑟夫环
约瑟夫环 (约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出圈;他的下一个人又从1开始报数,数到m的那个人又出圈;依次规律重复下去,直到剩余最后一个胜利者。例如:有10个人围成一圈进行此游戏,每个...

约瑟夫环问题的第推公式是怎么来的阿~~
\/*约瑟夫问题的数学方法 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个...

我在网上搜索约瑟夫问题,有个简化版的c程序,但是算法看不明白,有人知道...
看来你还是可以看懂程序的,你的提问中F[i]=(F[i-1]+m)%i 这个相当于递归算法了。也就是你问题中已经分析好了n个值与n-1个值的关系了。那么你要理解的东西就很明白了 那s=(s+m)%i;也就是逆推,假如知道从2个人开始玩约瑟夫,那么逆推出3个人,4个人。。。到n个人不就一样了吗。而公式...

约瑟夫环的由来
解决约瑟夫环问题的方法可以是使用递归或循环。递归方法是通过定义一个函数来模拟这个过程,每次调用函数都会将人数减少一个,直到只剩下一个人为止。循环方法则是通过设置一个计数器来模拟这个过程,每次计数器达到一定数值就移出一个人,直到只剩下一个人为止。约瑟夫环在数学中的应用:1、图论:约瑟夫环...

含有n个数字的圆圈中每次删除第m个元素,求最后剩下的数字,给出程序
\/*约瑟夫环问题,总共人数为length,从1报数,数到seg者退出,然后继续从1开始报数,直至 最后只剩1人为止 *\/ int JohnsonRing(int length, int seg){ int arr[100];int i, k, n;\/*设置每一个人的出局标志:0在列,1退出*\/ for(i=0; i<length; i++){ arr[i] = 0;} i = 0;k...

怎样用vb实现约瑟夫环算法??
三、以类作为结点来处理约瑟夫问题(准C++编程风格) 1、以类作结点的链表建立 #include <iostream.h> class Node { private: int data; Node *next; public: Node(){data=0;next=NULL;} void SetData(int new_data){data=new_data;} void SetNext(Node *new_next){next=new_next;} ...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
elements.for(int k=1;k<m;k++)p=p->next;p_tmp=p->next;p->next=p_tmp->next;cout<<endl<<"Get rid of:"<entry;delete p_tmp;} \/\/Print the left element cout<<endl<<"The left element is:"<entry<<endl;} 我这个学期也搞数据结构 程序可以运行的 ...

相似回答