java
约瑟夫环算法?
一、约瑟夫环算法?
约瑟夫环指的是,n个人按编号顺序围成一个环,设置一个数字m,其中m<n(一般m取0-9之间的数);并从环中的第一个人开始,按顺时针数数,每数了m个位置,排在m号的位置上的人出列,然后从出列的位置的下一个位置上的人开始数,一直到环中剩下最后一个人为止。
算法步骤:
(1)确定存储结构:由于是一个环,所以建立一个循环链表
(2)设置指针个数:设置一个头指针*front永远指向第一个结点(按数字顺序的话是指向环中最小的那个节点也可又从0开始数),再设置一个尾指针*prior用于指向报数的人的位置,每报一次数,尾指针指向下一个节点,数到m号时,则删除该节点,并将尾指针指向下一个节点,一直循环下去。
定义节点类型:
typedef struct Node
{
int data;
struct Node *next;
struct Node *front;
struct Node *prior;
}Node,*LinkList;
(3)向链表插入n个人(采用尾插法):
LinkList Create_cirlce()
{
LinkList L,r,p;
L = (Node *) malloc ( sizeof (Node)); //初始化链表
L->next = L;
r = L; //r始终指向最后一个结点
int n;
while ( scanf ( "%d" ,&n) != EOF)
{
p = (Node *) malloc ( sizeof (Node));
p->data = n;
p->next = r->next;
r->next = p;
r = p;
}
r->next = L;
return L;
}
(4)根据指针判断链表是否已出列到最后一个:判断*prior->next!=L
(5)利用循环遍历出出列的人:此时需利用两个循环,外循环代表遍历到最后一个所需要的循环次数,内循环代表遍历出列的人
void Josephus(int n,int m){
for(int i=0;i<n-1;i++){
for(int j=0;i<m-1;j++){
Next();//遍历出出列的人
cout<<"出列的人是:"<<current;//显示出当前出列的人的位置
二、约瑟夫环是几年级学?
约瑟夫环问题通常是中学阶段学习的内容,特别是涉及到数学中的数列和递推关系。具体年级可能因地区和教材版本而异,但一般来说,这个问题可能在初中高年级或高中阶段被引入。要理解约瑟夫环问题,学生需要具备一定的数列知识和逻辑推理能力,以及编程或数学递推求解的技能。因此,它可能出现在数学课程或计算机科学相关课程中。
三、c语言约瑟夫环数组法算法原理?
1. 构建一个单向循环链表(链表的尾部指向开头)
① 首先创建循环链表的头节点,让head指向该节点,并形成环形;
② 之后每当创建一个新的节点,就把该节点添加到已有的环形链表中。
2. 遍历单向的循环链表
在此遍历中,当有节点被删除以后,就要向后移动节点。
四、怎样用vb实现约瑟夫环算法?
用面向过程的编程方式(C),对某个给定的n=8与m=3,给出被淘汰出列的旅客编号,以及最终的幸存者。
用面向对象的编程风格(C++),重新处理该约瑟夫问题。
谈谈这两种编程风格的优点。
二、用C语言解约瑟夫问题
1、单链表的创建与输出
#include<stdio.h>
#include<malloc.h>
#define NULL 0
struct node{ /*定义结构体*/
int data;
struct node *next;
};
typedef struct node NODE;/*将该结构体设置成自定义类型*/
NODE *head;/*定义一个指向该结构体的头指针*/
NODE *create(int n)/*创建具有n个结点的单链表*/
{
NODE *p;
int i=1;
head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
while(i<=n)
{
p=(NODE *)malloc(sizeof(NODE));
p->data=n+1-i;
p->next=head->next;
head->next=p;
i++;
}
return(head);
}
void output(NODE *point)/*输出该链表数据域内的值*/
{
NODE *p;
p=point->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
如果我们写一段main()函数
void main()
{
head=create(8);
output(head);
}
便可以完成创建和输出单链表的工作。
如果将上述创建单链表与输出单链表的工作保存为头文件link1.h,那么在今后需要创建输出类似的单链表时,只需写以下主函数即可。
#inlucde “link1.h”
void main()
{
head=create(8);
output(head);
}
2、循环单向链表的创建与输出
明白了带头指针的单向链表的创建与输出,只需作简单修改便可处理循环单向链表的相关问题。这里我们建立一个新的头文件link2.h,它包含以下几段代码。
#include<stdio.h>
#include<malloc.h>
struct node{
int data;
struct node *next;
};
typedef struct node NODE;
NODE *head;
NODE *create(int n)
{
NODE *p;
int i=1;
p=head=(NODE *)malloc(sizeof(NODE));
head->next=head;/*造循环链表时头指针的指针域设置*/
while(i<=n)
{
p->data=n+1-i;
p->next=head->next;
head->next=p;
i++;
p=(NODE *)malloc(sizeof(NODE));
}
return(head);
}
void output(NODE *point,int n) /*n表示欲输出多少个结点,由于该链表是循环的,可输出无穷项*/
{
NODE *p;
int i=1;
p=point->next;
while(i<=n)
{
printf("%d ",p->data);
p=p->next;
i++;
}
printf("\n");
}
3、在循环链表中删除结点并输出被删结点的相关信息
在头文件link2.h中增添新函数del(int n,int m),这里的形参n代表起始结点,m代表报数值。
void del(int n,int m)
{
int i;
NODE *p,*q;
p=head;
/*将指针移到起始结点,即第n个结点*/
i=0;
while(i<n)
{
p=p->next;
i++;
}
/*删除满足报数值的结点*/
while(p->next!=p)
{
i=1;
while(i<m)/*找到符合报数值结点的前一个结点,即第m-1个结点*/
{
p=p->next;
i++;
}
/*先输出,后删除*/
q=p->next;
printf("%d ",q->data);
p->next=q->next;
free(q);
}
printf("\nonly one %d",p->data);/*输出仅剩的结点*/
}
4、解决约瑟夫问题的主函数
#include <link2.h>
void main()
{
/*number结点个数,item输出结点的个数,location报数的起始位置,callnum报数值*/
int number,item,location,callnum;
printf("\ninput nose number=");
scanf("%d",&number);
printf("\noutput item=");
scanf("%d",&item);
head=create(number);
output(head,item);
printf("\ninput location=");
scanf("%d",&location);
printf("\ninput callnum=");
scanf("%d",&callnum);
del(location,callnum);
}
三、以类作为结点来处理约瑟夫问题(准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;}
int GetData(){return data;}
Node *GetNext(){return next;}
};
void main()
{
Node *head=NULL,*p,*q;
for(int i=1;i<9;i++)
{
p=new Node;
p->SetData(i);
if(head==NULL)
head=p;
else
q->SetNext(p);
q=p;
}
q=head;
do
{
cout<<"该游客编号为:"<<q->GetData()<<endl;
q=q->GetNext();
}while(q!=NULL);
q=head;
do
{
q=q->GetNext();
delete head;
head=q;
}while(q!=NULL);
}
2、以类作结点的循环链表的建立
#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;}
int GetData(){return data;}
Node *GetNext(){return next;}
};
void main()
{
Node *head,*p,*q;
head=new Node;
q=p=head;
for(int i=1;i<=8;i++)
{
p->SetData(i);
p->SetNext(head);
q->SetNext(p);
q=p;
p=new Node;
}
q=head;
i=1;
do
{
cout<<"该游客编号为:"<<q->GetData()<<endl;
q=q->GetNext();
i++;
}while(i<=10);
}
3、解决约瑟夫问题
#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;}
int GetData(){return data;}
Node *GetNext(){return next;}
};
void main()
{
Node *head,*p,*q;
head=new Node;
q=p=head;
for(int i=1;i<=8;i++)
{
p->SetData(i);
p->SetNext(head);
q->SetNext(p);
q=p;
p=new Node;
}//
p=head;
i=1;
while(i<=8)
{
cout<<p->GetData()<<" "<<endl;
p=p->GetNext();
i++;
}//输出
cout<<endl;
p=head;
while(p->GetNext()!=p)
{
i=1;
while(i<2)
{
p=p->GetNext();//将欲删除点的前一个结点
i++;
}
q=p->GetNext();
cout<<q->GetData()<<endl;//删除循环链表上的结点
p->SetNext(q->GetNext());//将q指针域所指结点的地址赋给p的指针域
p=p->GetNext();
delete q;
}//做循环数数出局游戏
cout<<"\nLast One "<<p->GetData()<<endl;
}
四、用标准的面向对象编程风格处理约瑟夫问题(C++编程风格)
//#include "stdafx.h"
#include "iostream.h"
//#define NULL 0
class Node
{
private:
int data;
Node *next;
public:
Node(){data=0;next=NULL;}
Node *Create(int n);//创建含n个结点的循环链表
void Output(Node *p,int n);//输出循环链表头结点为p的后n个结点的信息
Node *Move(Node *p,int n);//将头结点指针前移到n
//从头结点为p的循环链开始,所用的计数为n进行约瑟夫实验
void Josephus(Node *p,int n);
};
Node *Node::Create(int n)
{
Node *head,*p,*q;
head=new Node;
q=p=head;
for(int i=1;i<=n;i++)
{
p->data=i;
p->next=head;
q->next=p;
q=p;
p=new Node;
}
return head;
};
void Node::Output(Node *p,int n)
{
int i=1;
while(i<=n)
{
cout<<p->data<<" ";
p=p->next;
i++;
}
};
Node *Node::Move(Node *p,int n)
{
if(n>1)
{
int i=1;
while(i<n)
{
p=p->next;
i++;
}
}
return p;
};
void Node::Josephus(Node *p,int n)
{
Node *q;
while(p->next!=p)
{
p=Move(p,n-1);
q=p->next;
cout<<q->data<<" ";
p->next=q->next;
p=p->next;
delete q;
}
cout<<"\nLast One "<<p->data<<endl;
};
void main()
{ Node A,*head;
head=A.Create(8);
cout<<"\nCirclist is ";
A.Output(head,10);
head=A.Move(head,1);
cout<<"\nJosephus result is "<<endl;
A.Josephus(head,3);
}
五、对两种编程风格的评述
在进行面向过程的程序设计时,一般首先考虑程序所要实现的功能,然后设计为实现这些功能所必须采取的步骤,这些步骤就是过程。如果一个过程比较复杂而不能直接使用已有的抽象进行实现,则对这个过程进行分解,使分解之后的每一步(更低级的过程)能够直接对应着一条语句。通过将分解之后的一系列过程封装在一个函数抽象中,程序员在特定的时刻只关心有限的细节,这个新的函数抽象比其较低级的抽象更接近问题求解的过程,因而,能够很好地映射问题求解中的过程。如果这个过程出现在许多问题求解中,那么,这个函数抽象就可能被重复利用。
函数是面向过程程序设计的基础,按照结构化程序设计的思想,又可将完成某一复杂工作的函数放在一个头文件,便于我们多次复用。
面向过程的程序设计方法与面向对象的程序设计方法的根本区别在于对待数据和函数的关系上。
在面向过程的程序设计中,数据只被看作是一种静态的结构,它只有等待调用函数来对它进行处理。
在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。另外,封装还提供了一种对数据访问严格控制的机制。因此,数据将被隐藏在封装体中,该封装体通过操作接口与外界交换信息。
面向对象的思想需要在实践中不断摸索和体会,在以后的程序设计中,可主动运用这种思想去实践。
五、java数组编写猴子选猴王
Java数组:编写猴子选猴王算法
Java数组是Java编程语言中最常用最基本的数据结构之一。在编写Java程序时,经常需要进行数组操作,比如对数组进行排序、查找等。本文将介绍如何利用Java数组编写一个猴子选猴王的算法。
猴子选猴王问题
猴子选猴王是一个古老的算法问题,描述如下:有N只猴子(N>=1),这些猴子按顺时针方向围坐在一堆桃子周围。第一只猴子从第一个桃子开始数,数到第M只猴子所在的桃子,将桃子吃掉,接着从下一个桃子开始继续数。如此循环,直到桃子吃完,最后剩下的那只猴子即为猴王。
现在我们来用Java数组来实现这个猴子选猴王的算法。
Java数组实现猴子选猴王算法
首先,我们需要定义一个数组来表示N只猴子,可以使用Java中的数组对象:
int[] monkeys = new int[N];接下来,我们需要模拟猴子选猴王的过程。具体步骤如下:
- 初始化猴子数组,为每只猴子分配一个编号。
- 设置一个变量表示当前猴子位置,初始位置为0。
- 循环遍历数组,模拟猴子选猴王过程。在每轮中,找到第M只猴子所在位置,将其移除。
- 重复上述步骤,直到只剩下一只猴子。
下面是用Java代码实现猴子选猴王算法的示例:
public int findMonkeyKing(int N, int M) { int[] monkeys = new int[N]; for (int i = 0; i < N; i++) { monkeys[i] = i + 1; } int currentMonkey = 0; while (N > 1) { currentMonkey = (currentMonkey + M - 1) % N; for (int j = currentMonkey; j < N - 1; j++) { monkeys[j] = monkeys[j + 1]; } N--; } return monkeys[0]; }
在上面的代码中,N表示猴子的数量,M表示每次数到第几只猴子。findMonkeyKing()方法返回最后选出的猴王的编号。
总结
通过以上实现,我们成功用Java数组编写了猴子选猴王的算法。数组在Java编程中扮演着重要的角色,熟练掌握数组操作对于提高编程效率至关重要。希望本文能帮助您更好地理解Java数组和算法问题的处理方式。
注意:以上代码仅为示例,请根据实际情况进行调整和优化。
六、猴王47金酒的钢环什么材质?
合金钢 合金钢 alloy steel 钢里除铁、碳外,加入其他的合金元素,就叫合金钢。
在普通碳素钢基础上添加适量的一种或多种合金元素而构成的铁碳合金。根据添加元素的不同,并采取适当的加工工艺,可获得高强度、高韧性、耐磨、耐腐蚀、耐低温、耐高温、无磁性等特殊性能。七、java编写一个环形类,求环的面积?
public class Circle{
public static final double pie=3.14;
public static double area1(double r)
{
return pie*r*r;
}
public static double area2(double r)
{
return pie*r*r;
}
public static double circleArea()
{
return Circle.area1(圆1的半径)-Circle.area2(圆2的半径);
}
}
最后在主方法调用即可
八、java怎么实现同比环比在同一图表上?
1、打开一个ppt文档,插入柱状图表2、添加你需要的数据,3、可看出相关相关竖坐标是月份,不是我们需要的,点击设计菜单栏下的《切换行/列》
4、初步得到我们需要的图表5、现在需要把“同比和环比增长率”改成折线形式;左击“同比增长率”,将系列绘制在“主坐标轴”改成“次坐标轴”;得到第三个图表6、现在左击同比增长率的,更改图表类型,变成我们需要的折线图用同样的方法将“环比增长率”也改成折线图7、如果想将数据也表示在图表下方,可点击布局下方的《显示数据表选项》,再更改一相右边竖坐标轴的格式,改成百分比格式即可。
九、梦幻西游。猴王出世副本,第二环,宝箱在什么位置?
位置不确定,因为箱子是随机刷的,并没有固定位置,但系统会有提示,玩家留意即可。任务要求:猴王出世:
1、多环任务(任务时间:150分钟,参加级别:玩家≥50级,参加人数:10人)。
2、副本难度较小,需相互配合,战斗节奏快而短。更多取决于玩家对任务的熟悉程度。
3、副本每环任务最多有一次失败机会(失败1次后完成副本所获得的奖励将降低) ,战斗死亡计算正常死亡损失(原地复活),任务失败及完成均传送至长安城。扩展资料:在最后一个环节找宝箱的时候,在第一层其实是有2个蟹将的,一个是通往真正宝箱的位置,另一个是找到偷懒水卒。如果玩家先是找到偷懒水卒记得找虾兵重新返回第一层找到另外一个蟹将,这样往下走就可以找到宝箱了。在通过传送寻找宝箱的过程当中,玩家可能会遇到卡在光圈走不了的时候,记得打开小地图,使用自动寻路这样就可以走出来了。
十、梦幻西游中猴王出世副本第一环做完了.怎么做第二环?
第二环:借宝 首先还是从老地方进入,就是傲来国的金毛猿,坐标是(193,131) 进入后找到崩或者芭二个将军领取麻袋,崩将军在(38,41)芭将军在(62,24) 传送过去后是AL地图,一共有4处打铁炉与铁匠,坐标分别是 (167,63),(130,36),(77,87),(78,99) 在周围点右键即可,有时候会遇怪,遇怪之后逃跑然后重新点右键,在上交麻袋的时候会拿到 拿到东西后,使用FF或者棋子重新回到现实的AL场景传送至副本地图上交麻袋。
收集完后,点长眉老猴传送至龙宫 (不过数量稀少,作用是能在战斗中直接将AL士兵吹走) 进入水晶宫需要杀龙宫四门守卫洪总兵、青将军、瓦先锋和乌太尉才能破除龙王布下的结界 (遇怪时间与游泳相同,点香无用 有人一定要让我点香试试) 杀完四门守卫后点龙女才能进入水晶宫,不是跟平时一样进去的哦 进入水晶宫后点老龙王会传送你去龙宫宝库取5件装备(装备不会出现在道具栏) 拿完装备点三公主会进入战斗,连续战斗3场,无WZ的队伍带好药,不然打到最后场很辛苦,特别是DT多的队 打完之后继续点三公主进入组合迷宫,还是不停的遇怪,里面有2个NPC造型:虾兵与蟹将。其中虾兵是传送到上一层,蟹将是传送到下一层的。点宝箱后立即进入战斗,战斗结束后自动传送出副本。注意事项: 1。副本开启后,任何时间都允许进入虚拟场景!! 2。拿到奖励会上系统。热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...