约瑟夫问题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);
}
说明一下:gcorelabs的俄罗斯远东机房“伯力”既有“Virtual servers”也有“CLOUD SERVICES”,前者是VPS,后者是云服务器,不是一回事;由于平日大家习惯把VPS和云服务器当做一回事儿,所以这里要特别说明一下。本次测评的是gcorelabs的cloud,也就是云服务器。 官方网站:https://gcorelabs.com 支持:数字加密货币、信用卡、PayPal...
乐凝网络怎么样?乐凝网络是一家新兴的云服务器商家,目前主要提供香港CN2 GIA、美国CUVIP、美国CERA、日本东京CN2等云服务器及云挂机宝等服务。乐凝网络提供比同行更多的售后服务,让您在使用过程中更加省心,使用零云服务器,可免费享受超过50项运维服务,1分钟内极速响应,平均20分钟内解决运维问题,助您无忧上云。目前,香港HKBN/美国cera云服务器,低至9.88元/月起,支持24小时无理...
RAKsmart 商家估摸着前段时间服务器囤货较多,这两个月的促销活动好像有点针对独立服务器。前面才整理到七月份的服务器活动在有一些配置上比上个月折扣力度是大很多,而且今天看到再来部分的服务器首月半价,一般这样的促销有可能是商家库存充裕。比如近期有一些服务商挖矿服务器销售不好,也都会采用这些策略,就好比电脑硬件最近也有下降。不管如何,我们选择服务器或者VPS主机要本着符合自己需求,如果业务不需要,...
约瑟夫问题为你推荐
strcatstrcat函数的使用xclientxclient校园网的客户端一直显示查找设备的原因?????急急急,好多天不能上网了···········oracle索引如何在ORACLE数据库的字段上建立索引oracle索引什么是Oracle的函数索引?索引超出了数组界限求助大神什么叫索引超出了数组界限网页微信客户端什么叫微信网页版?和电脑版是一回事吗?民生电商陆金所、民生电商哪个更适合投资?国际加速世界经济全球化加速发展的表现有哪些?在全球化趋势加强的过程中,人类共同面临的问题有哪些?桌面管理系统电脑的操作系统有几种?网站免费收录免费个人网站能给百度收录吗
美国免费虚拟主机 武汉域名注册 过期备案域名查询 免费注册网站域名 免费域名跳转 谷歌域名邮箱 瓦工 t楼 韩国电信 wordpress技巧 大容量存储 电子邮件服务器 徐正曦 流量计费 鲁诺 能外链的相册 512mb shuang12 华为云建站 徐州电信 更多