约瑟夫问题的流程图

约瑟夫问题的流程图,第1张

这个问题用一维数组即可解决。

这是我自己写的一段代码:

//功能:解决约瑟夫问题

#include<stdio.h>

#define N 9

#define K 2

#define M 3

//给数组赋值

void setDate(int a[],int n)

{ int i

for(i=0i<侍者如ni++)

a[i]=i+1

}

//删除被选中的孩子

void deleted(int a[],int m,int len)

{

int i=m

do

{

a[i]=a[i+1]

i++

}while(i<len)

}

//开始老启play

void play(int a[],int k,int m)

{

int len =N

int dm=k+m-2//第一个嫌数被剔除的孩子

while(len!=1)

{printf("第%d个孩子被剔除。\n",a[dm])

deleted(a,dm,len)//将被剔除的孩子从数组中删除

dm=dm+M-1//下一个被剔除的孩子

len--//数组的长度减1

if(dm>=len) dm=dm-len

}

printf("最后一个孩子是%d.",a[0])//最后一个孩子被放在a[0]中

}

main()

{

int a[N]

setDate(a,N)

play(a,K,M)

}

这个很难界定,看看下面资料吧 1.西元1801年法国人约瑟夫�6�4杰夸德(JosephJacquard)发明使用打孔卡片(Punched carboard card)控制的自动化织布机。对未来电脑的发展引进两个重要的观念:一、资讯可以在打孔卡片上编脊毁高码(Coded)二、资讯可以储存在卡片上,而且当这些卡片成串的组合在一起,就可以做为一连串的指令 - 实际上也就是程式。 2.西元1833年英国数学家剑桥大学的查理�6�4巴贝基(Charles Babbage)完成一部差分机(Difference engine),尔后并完成一部功能更强的机器,称为分析机(Analytical engine),这一部机器在观念上与现代电脑极为相似,对计算机余渗贡献良多,因尊称为「电脑之父」。至於分析机的有些构思是来自其密友兼同事 - 萝蕾斯伯爵夫人(Countess of Lovelace),即诗人拜仑(Byron)的女儿艾达�6�4奥古斯塔(Ada Augusta)的惊人见解。她被公认为"程式设计的鼻祖"(The first programmer),她所研究就是一种用来送入分析机,并能使这部机器执行工作的指令。 3. 西元1890年,美国政府授命赫勒里斯制造一部机器,来协助执行1890年美国人口普查工作。这部机器是以打孔片储存资料,而且是由电力带动的。由於这部机器的协助,人口普查的统计结果只花了三年的时间就完成了(如1880年度的人口普查资料花了七年的时间才统计完成,而且官员们还担心著是否会遗漏了其中某些的细节)。 这些发明只是用来辅助计算的工具樱尺,它们都没有记忆与储存资料的功能, 因此不能称为 『 电脑 』。 二.发展史:世界上第一部『 电脑 』是由 美国人毛琪雷与爱克特在 1946 年发明。随著电脑科技之进步,『 电脑 』已由庞然大物演变到现在的微型电脑,也就是我们所称的 个人电脑 ( Personal Computer ) 简称 PC。 三. 电脑的特性: 1.速度快 2.储存容量大 3.准确性高

你这个问题其实是一个约瑟夫环的问题,我给你写了一个程序,其中每个人的密码是逐个给的,仅供参考,这应该是数据结构课程中有关循环队列的知识。

程序代码如下:(运行环境:Microsoft Visual C++ 6.0)

#include<iostream.h>

#include<stdlib.h>

#include<string.h>

typedef struct Node{//结点的数据类型

int data

Node* next

}Node,*Lnode

void Del_Out(Lnode L,int m,int n) //约瑟夫环出环顺序函咐烂颤数

{

int iLnode p,q

for(p=L,i=1!(i==n)i++) p=p->next

for(i=1!(p==p->next)i++){ //约瑟夫环出环顺序循环

if(i%m==0){

q=p->next//报到M的人出圈

cout<<q->data<<'\t'

p->next=q->next

delete q

cout<<"请输入下一个报数起始人持有的密码m="

cin>历谈>m

if(m<1){

cout<<"m必须是大于0的正整数!"<<endl

m=1

}

i=0

}

else p=p->next //末报到M的不出圈

}

cout<<p->next->data<<'\n'delete p

}

char* InCheck(void)//输入值并验证函数

{

char* X=new char[50] //输入缓冲区

if(!X){ cout<<"申请动态内存失败!\n"exit(3)}

cin.getline(X,50)

for(int y=0y<(strlen(X))||strlen(X)==0y++) //非法输入数据重新输入的循环

if(X[y]>57||X[y]<48||strlen(X)==0)

{

cout<<"非法输入!请重新输入:"

cin.getline(X,50)

y=-1

continue

}

return X

}

void welcome()

{

cout<<"******************欢迎使用本程序******************\n\n"

cout<<"********本程序为实现约瑟夫环出环顺序的程序衡败********\n"

cout<<"**请根据提示分别输入约瑟夫环的报数值M和环总数值N**\n\n"

cout<<"**************************************************\n\n"

}

void main(void)

{

int m,n

Lnode L,S,R

L=NULL

welcome()

do{ cout<<"请输入M(报数值)的值:"m=atoi(InCheck())}while(m<=0)

do{ cout<<"请输入N(环总数值)的值:"n=atoi(InCheck())}while(n<=0)

for(int i=ni>0i--)//新建一条循环单链表

{

S=new NodeS->data=i

if(!L) R=L=S,L->next=NULL

else S->next=L,L=S

}

R->next=L

cout<<"\n该约瑟夫环出环顺序为:\n"

Del_Out(L,m,n)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12490623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存