约瑟夫问题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);
}
今天早上相比很多网友和一样收到来自Linode的庆祝18周年的邮件信息。和往年一样,他们会回顾在过去一年中的成绩,以及在未来准备改进的地方。虽然目前Linode商家没有提供以前JP1优化线路的机房,但是人家一直跟随自己的脚步在走,确实在云服务器市场上有自己的立足之地。我们看看过去一年中Linode的成就:第一、承诺投入 100,000 美元来帮助具有社会意识的非营利组织,促进有价值的革新。第二、发...
零途云(Lingtuyun.com)新上了香港站群云服务器 – CN2精品线路,香港多ip站群云服务器16IP/5M带宽,4H4G仅220元/月,还有美国200g高防云服务器低至39元/月起。零途云是一家香港公司,主要产品香港cn2 gia线路、美国Cera线路云主机,美国CERA高防服务器,日本CN2直连服务器;同时提供香港多ip站群云服务器。即日起,购买香港/美国/日本云服务器享受9折优惠,新...
舍利云怎么样?舍利云推出了6核16G超大带宽316G高性能SSD和CPU,支持全球范围,原价516,折后价200元一月。原价80美元,现价30美元,支持地区:日本,新加坡,荷兰,法国,英国,澳大利亚,加拿大,韩国,美国纽约,美国硅谷,美国洛杉矶,美国亚特兰大,美国迈阿密州,美国西雅图,美国芝加哥,美国达拉斯。舍利云是vps云服务器的销售商家,其产品主要的特色是适合seo和建站,性价比方面非常不错,...
约瑟夫问题为你推荐
混淆矩阵confusionmat函数的功能是什么?saltstacksaltstack使用中的问题?master端sudo salt-master -l debug提示信息像这样,是什么情况?怎样改?1u在电子中 1u代表什么 为什么和931.5MeV对应 1u=931.4940MeV/c 这个公式的c又是什么 凌乱showwindowvb ShowWindow 的使用方法 隐藏/显示 指定窗口 (完整代码)谢谢showwindowC#中showwindow控件在哪里??策略组组策略是什么?网关和路由器的区别网关和路由器的具体区别在哪里呀?bindservice安卓里 remote service到底有什么用slideshare佳能复印MG3620怎么使用?spawningVC中Error spawning cl.exe错误的解决方法.
私服服务器租用 电信服务器租赁 godaddy域名解析教程 日本软银 美国翻墙 Dedicated 优key 创宇云 国内加速器 长沙服务器 国内php空间 域名接入 购买国外空间 服务器硬件防火墙 最漂亮的qq空间 外贸空间 免费个人主页 国内空间 带宽测试 阿里云个人邮箱 更多