问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求c++程序设计“约瑟问题”的算法

发布网友 发布时间:2022-05-24 07:15

我来回答

3个回答

热心网友 时间:2023-10-08 16:41

C++ 的一个约瑟夫环问题函数(自己调用即可):
void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
{
/* p为当前结点 r为辅助结点,指向p的前驱结点 list为头节点*/
LinkList p,r,list;
/*建立循环链表*/
for(int i=0,i<n,i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=i;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
p->link=list; /*使链表循环起来*/
p=list; /*使p指向头节点*/
/*把当前指针移动到第一个报数的人*/
for(i=0;i<k;i++)
{
r=p;
p=p->link;
}
/*循环地删除队列结点*/
while(p->link!=p)
{
for(i=0;i<m-1;i++)
{
r=p;
p=p->link;
}
r->link=p->link;
printf("被删除的元素:%4d ",p->data);
free(p);
p=r->link;
}
printf("\n最后被删除的元素是:%4d",P->data);
}

数学方法解决:
[编辑本段]Josephus(约瑟夫)问题的数学方法
无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。
为了讨论方便,先把问题稍微改变一下,并不影响原意:
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出
,剩下的人继续从0开始报数。求胜利者的编号。
我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2
并且从k开始报0。
现在我们把他们的编号做一下转换:
k --> 0
k+1 --> 1
k+2 --> 2
...
...
k-3 --> n-3
k-2 --> n-2
变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x‘=(x+k)%n
如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。(n-2)个人的解呢?当然是先求(n-3)的情况 ---- 这显然就是一个倒推问题!好了,思路出来了,下面写递推公式:
令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n].
递推公式:
f[1]=0;
f=(f[i-1]+m)%i; (i>1)
有了这个公式,我们要做的就是从1-n顺序算出f的数值,最后结果是f[n]。因为实际生活中编号总是从1开始,我们输出f[n]+1由于是逐级递推,不需要保存每个f,程序也是异常简单:
#include <stdio.h>
int main(void)
{
int n, m, i, s=0;
printf ("N M = ");
scanf("%d%d", &n, &m);
for (i=2; i<=n; i++)
s=(s+m)%i;
printf ("The winner is %d\n", s+1);
return 0 ;
}
这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。算n,m等于一百万,一千万的情况不是问题了。可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。

热心网友 时间:2023-10-08 16:42

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int a[31]={0},b[15];//a存的是这30个人,b存的是15个异教徒的位置
int i,t,pos=0,n=0;//一遍一遍地遍历数组,pos指向数组的某一位
for(i=0;i<15;i++)//找15次
{
t=0;
while(t<9)//每次向后走9个位置
{
pos++;
if(pos==31) pos=1;
if(a[pos]==0) t++;
}
a[pos]=1;
b[n++]=pos;
}
for(i=0;i<15;i++)
cout<<b[i]<<' ';
cout<<endl;

sort(b,b+15);
for(i=0;i<15;i++)
cout<<b[i]<<' ';
cout<<endl;
return 1;
}

输出结果:9 18 27 6 16 26 7 19 30 12 24 8 22 5 23
经过sort排序后输出的结果为:5 6 7 8 9 12 16 18 19 22 23 24 26 27 30
这15个位置就是异教徒的位置了

就提论题了,如果要找比较系统详细的约瑟问题百科里应该有,各种类型的
希望能帮到你O(∩_∩)O~

热心网友 时间:2023-10-08 16:42

#include <iostream>
#define NUMFIAG 9
using namespace std;
int main()
{
int human[30];//总共人数
int count = 0;//投海人数
int pos = 0;//位置坐标
memset(human , 0 , sizeof(int)*30);
int index = 1;//报数
while(count < 15)
{
if(human[pos % 30] != 1)//未投海。计算有效
{
if(index == NUMFIAG)//够数,投海
{
human[pos % 30] = 1;
count ++;
index = 1;
}
else //继续报数
index++;
}
pos ++;
}
for(int i =0;i<30;i++)
{
if(human[i] == 1)
printf("第%d个设为异教徒\r\n" , i);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华为手机删除qq聊天记录还能恢复吗 曙光英雄怎么登录以前的账号,曙光英雄曙光英雄客户端在哪里下载? 曙光英雄怎么注销账号 详细注销方法分享 曙光英雄怎么注销账号-账号注销方法介绍 六大茶类之青茶知识大科普 六大茶类香气类型之青茶(乌龙茶)茶香 六大茶类之青茶 简单认识六大茶类之青茶 一文带你全面认识六大茶类中的青茶,速来围观 识茶笔记:六大茶类之青茶篇 试用循环链表为存储结构,写一个约瑟夫问题的算法。 josephus problem 约瑟夫环 C语言 约瑟夫环问题的C++算法,求用链表和递归两种方法,尽量详细! C语言编程Josephus问题 描写解决约瑟夫问题的算法,按出列顺序组成新的表,然后再输出 Josephus环算法的设计 流程图 怎样用vb实现约瑟夫环算法?? josephus问题数据结构C 编写C语言算法,试编写一个求解Josephus问题的函数,用整数序列1, 2, 3, …… 约瑟夫环的算法原理 求解josephus问题的算法 什么是约瑟夫法则 用弹簧测力计探究动滑轮的省力特点的视频 弹力测力计的使用方法 如题 快影制作视频封面微信发却没有 sql group 后按分组数量的多少排序怎么写? 求助asp 中group by 的用法是什么啊!! 急!急!为什么有时用groupby结果还是显示同一个人的记录 sql group by 排序问题 sort by 和 group by 的区别是什么? SQL中的group by为什么是按照分组的第二个字段排序的呢? 约瑟夫难题的约瑟夫指的是哪位约瑟夫? 《假面骑士W》免费在线观看完整版高清,求百度网盘资源 没有壳的蛋能否放进微波炉呢? 鸡蛋(没脱壳)为什么不能放在微波炉里叮呢? 一兆瓦是多少度 60版2元人民币的价格表? 60版2元纸币编号6888888有收藏价值吗? M1的USB接口在接普通U盘的时候可以识别,在接移动硬盘的时候不能识别 吉利星越L雷神Hi·X油电混动版12月25日预售 最大续航1300公里 吉利星越L雷神Hi·X油电混动版月底开售 最大续航1300公里 我的移动硬盘无法读取怎么回事 我的世界有没有办法隐藏章鱼 删除章鱼tv我看风云直播出现章鱼插件按装完成?怎样删掉它? 我原来看别人下载了个软件,图标是个红色的小章鱼 C# 的应用程序怎么打包成setup可执行文件, 发布之后要在没有安装.net framework 用inno setup打包安装工具生成的EXE程序,在安装的时出现【试图在初始化之前展开“app”常量】怎么解决? 关于vb的打包工具setup factory7.0的使用,请高手帮帮忙,谢谢! msi打包与setup打包有什么区别?各有什么优点? 使用InstallShield工具打包,怎么修改生成的Setup.exe的图标 求一款能将.net发布好的网站打包成setup.exe的工具,点击安装包就可以部署iis和数据库安装