约瑟夫问题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);
}
digital-vm怎么样?digital-vm在今年1月份就新增了日本、新加坡独立服务器业务,但是不知为何,期间终止了销售日本服务器和新加坡服务器,今天无意中在webhostingtalk论坛看到Digital-VM在发日本和新加坡独立服务器销售信息。服务器硬件是 Supermicro、采用最新一代 Intel CPU、DDR4 RAM 和 Enterprise Samsung SSD内存,默认...
野草云服务商在前面的文章中也有多次提到,算是一个国内的小众服务商。促销活动也不是很多,比较专注个人云服务用户业务,之前和站长聊到不少网友选择他们家是用来做网站的。这不看到商家有提供香港云服务器的优惠促销,可选CN2、BGP线路、支持Linux与windows系统,支持故障自动迁移,使用NVMe优化的Ceph集群存储,比较适合建站用户选择使用,最低年付138元 。野草云(原野草主机),公司成立于20...
专心做抗投诉服务器的VirtVPS上线瑞士机房,看中的就是瑞士对隐私的保护,有需要欧洲抗投诉VPS的朋友不要错过了。VirtVPS这次上新的瑞士服务器采用E-2276G处理器,Windows/Linux操作系统可选。VirtVPS成立于2018年,主营荷兰、芬兰、德国、英国机房的离岸虚拟主机托管、VPS、独立服务器、游戏服务器和外汇服务器业务。VirtVPS 提供世界上最全面的安全、完全受保护和私...
约瑟夫问题为你推荐
图片地址怎么获得图片地址fclose为什么fclose之后remove还是不成功查字网騳骉,怎样读?拼音slideshare幻灯片的占位符的作用是?清除电脑垃圾怎样清除电脑垃圾国外社交网站国外联合中国的交友网站toolstripWinOperationClass是什么来的,什么用桌面管理系统电脑的操作系统有几种?酷源码我在网上下载好了企业源码 需要怎么修改才可以直接上传到我的空间(我以有上传工具了)就是不会上修改和上数学作业小学一年级数学布置作业怎么布置
虚拟主机代理 免费域名 域名注册中心 如何申请免费域名 a5域名交易 草根过期域名 plesk site5 中国特价网 百兆独享 web服务器的架设 阿里校园 爱奇艺vip免费试用7天 安徽双线服务器 免费mysql数据库 厦门电信 空间登入 国外网页代理 阿里dns 97rb 更多