约瑟夫问题C语言编程问题:约瑟夫问题求解
约瑟夫问题 时间:2021-07-16 阅读:(
)
约瑟夫问题链表方法
//原来的程序是用数组做的,这个题目用数组做其实比用链表要直观,简便
//给出一个链表的解法:
#include <iostream>
#include <malloc.h>
struct man{
int num; //编号
bool out; //是否报过数
struct man *next;
};
#define N 100 /*圈内人数*/
#define M 10 /*报数*/
using namespace std;
void main(){
man *head,*p,*q;
int i,j=0;
head=(man*)malloc(sizeof(man));
p=head;
head->num=1;
for(i=2;i<=N;i++) /*编号*/{
q=(man*)malloc(sizeof(man));
q->num=i;
p->next=q;
p=q;
}
q->next=head; //采用的是循环链表
int count=N;
while(count){
p->out=false;
p=p->next;
count--;
}
cout<<"The out sequence is:"<<endl; //打印出圈顺序
p=head;
while(count<N){
while(j<M){
q=p;
if(!(p->out)) j++;
p=p->next;
}
q->out=true;
cout<<q->num<<" ";
count++;
j=0;
}
cout<<endl;
getchar();
}C语言编程:约瑟夫问题
#include "stdio.h"
main()
{
int i,k,quit_num,a[30],*p;
p=a;
for(i=0;i<30;i++)
*(p+i)=i+1;
printf("the position of feijiaotu are:
");
quit_num=0;
k=0;
i=0;
while(quit_num<15)
{if(*(p+i)!=0)k++;
if(k==9)
{printf("%5d",*(p+i));
quit_num++;
*(p+i)=0;
k=0;
}
i++;
if(i==30)i=0;
}
printf("
the position of jiaotu are:
");
for(i=0;i<30;i++)
if(*(p+i)!=0)printf("%5d",*(p+i));
}求约瑟夫问题思路
m从k+1开始向后迭代
用数组a[2*k]存人,1为好人0为坏人,num存剩余人数,loc存当前位置
确定下一个人用a[(loc+m)%num](具体你再算算),若要杀的人是1则看num,num==k说明此m成功约瑟夫问题!!
只实现出列顺序
#define JN 7
#define JM 20
void jossen()
{
int a[JN+1];
int i=0;
int j=0;
int k=0;
//intpwd[JN+1];
for(i=0;i<=JN;i++) {a[i]=i; /*cout<<"input the password for man “<<i<<":"; cin>>&pwd[i]*/}
for(i=JN;i>=1;i--)
{
k=JM%i;
if(0==k) k=i;
/*cout<<"NO "<<JN+1-i<<": looking for "<<k<<" in: ";
for(j=0;j<=JN;j++) {cout<<"a["<<j<<"]="<<a[j]<<",";}
cout<<endl;*/
for(j=1;j<=JN;j++)
{
if(k == a[j])
{
cout<<j<<", ";
a[j]=0;
int l=1;
for(int p=j+1;l<i;p++)
{
if(p != JN+1 && a[p%(JN+1)])
{
a[p%(JN+1)]=l++;
}
//cout<<"a["<<p%(JN+1)<<"]="<<a[p%(JN+1)]<<",";
}
break;
}
}
cout<<endl;
}
}什么是约瑟夫问题
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C语言编程问题:约瑟夫问题求解
用一个循环链表就可以完成了!
#include
struct node{
int data;
struct node *next;
}node,*list,*p,*r;
void JOSEPHU(int n,int k,int m)
{
int i,j;
list=NULL;
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(node));
p->data=i;
if(list==NULL)
list=p;
else
r->next=p;
r=p;
}
p->next=list; /*建立一个循环链表*/
p=list;
for(i=1;i<=n+1;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("
"); /*打印链表,并检查循环链表是不输入正确*/
p=list;
i=1;
while(p&&inext;
++i;
}
for(i=1;inext;
}
printf("The out=%d
",p->data);
r->next=p->next;
}
}
void main()
{
int x, y, z;
printf("input the lenth n
");/*n,k,m分别代表总的人数,第一个报数的人,间隔的人数*/
scanf("%d",&x);
printf("input the start k
");
scanf("%d",&y);
printf("input the m
");
scanf("%d",&z);
JOSEPHU(x,y,z);
}
特网云特网云为您提供高速、稳定、安全、弹性的云计算服务计算、存储、监控、安全,完善的云产品满足您的一切所需,深耕云计算领域10余年;我们拥有前沿的核心技术,始终致力于为政府机构、企业组织和个人开发者提供稳定、安全、可靠、高性价比的云计算产品与服务。官方网站:https://www.56dr.com/ 10年老品牌 值得信赖 有需要的请联系======================特网云美国高防御...
月神科技是由江西月神科技有限公司运营的一家自营云产品的IDC服务商,提供香港安畅、香港沙田、美国CERA、成都电信等机房资源,月神科技有自己的用户群和拥有创宇认证,并且也有电商企业将业务架设在月神科技的平台上。本次带来的是全场八折促销,续费同价。并且上新了国内成都高防服务器,单机100G集群1.2T真实防御,上层屏蔽UDP,可定制CC策略。非常适合网站用户。官方网站:https://www.ysi...
racknerd怎么样?racknerd今天发布了几款美国特价独立服务器的促销,本次商家主推高配置的服务器,各个配置给的都比较高,有Intel和AMD两种,硬盘也有NVMe和SSD等多咱组合可以选择,机房目前有夏洛特、洛杉矶、犹他州可以选择,性价比很高,有需要独服的朋友可以看看。点击进入:racknerd官方网站RackNerd暑假独服促销:CPU:双E5-2680v3 (24核心,48线程)内存...
约瑟夫问题为你推荐
adobe官网考一个Adobe国际认证需要多少钱?跟国外比怎么样?有道云笔记网页版win10怎么用有道云笔记网页stackoverflowerrorjava.lang.StackOverflowError 是什么意思开票系统防伪税控开票系统怎么安装?layout_gravityandroid 布局中 为什么能够通过android:layout_above 、android:layout_alignTop 、等 还要在之前加入索引超出了数组界限什么是索引超出了数组界限layoutsubviews如何让NSSplitView的子View的大小固定相似图片搜索如何输入图片并且搜出最相似的图片?新手怎么制作表格怎么制作表格?药品标准查询药品国家标准怎么查阅
virpus 分销主机 南昌服务器托管 cpanel空间 毫秒英文 域名转向 网通服务器托管 1美金 流媒体加速 常州联通宽带 彩虹云 云营销系统 免费的域名 net空间 防cc攻击 域名转入 服务器防御 国外免费网盘 免费赚q币 塔式服务器 更多