约瑟夫问题c代码(数据结构中的约瑟夫环问题用C语言怎么编写出来啊)
本文目录
- 数据结构中的约瑟夫环问题用C语言怎么编写出来啊
- C语言:n人围圈m报数的约瑟夫老题,要求见图片,咋编
- c语言怎么解决约瑟夫问题
- 求解约瑟夫环问题 C语言
- C语言编程问题:约瑟夫问题求解
- 约瑟夫问题c语言
- 约瑟夫问题C语言代码修改
- 约瑟夫问题c语言实现代码
- 数据结构(c语言)用线性表实现约瑟夫问题,求求大佬帮我看看怎么实现
- 编写c语言程序解决约瑟夫问题,要求不用递归算法
数据结构中的约瑟夫环问题用C语言怎么编写出来啊
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出
圈子,问最后留下的是原来第几号的那位。
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.
2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法
则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了
相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本
人写的代码不会叫大家啐骂!
3.程序源代码:
#include 《*****》
#define N 50
#define S 3
void main()
{
int a;
int i,k;
int sum=N;
k=0;
for(i=0;i《N;i++)
a=i+1;
for(i=0;i《N;i++)
printf("%-4d",a);
printf("\n");
for(i=0;;i++)
{
if(sum==1)
break;
if(a!=0)
{
k++;
}
if(k==S)
{
k=0;
//printf("%4d",a);
a=0;
sum--;
}
}
for(i=0;i《N;i++)
if(a!=0)
printf("\n最后一个数为:%d\n",a);
}
两年前念书的时候写的,献丑了!
C语言:n人围圈m报数的约瑟夫老题,要求见图片,咋编
代码文本:
#include "*****"
#include 《*****》
struct s{
char x;
struct s *next;
};
void dellink(struct s *p){
struct s *q,*t;
for(t=p,q=p-》next;q!=t;q=q-》next){//释放链表函数
****(p);
p=q;
}
}
int main(int argc,char *argv){
struct s *p,*head;
int n,m,i,k,t;
printf("Enter n, m(int n,m》0)...\n");
if(scanf("%d%d",&n,&m)==2 && m》0 && n》0){//输入总人数和报数间隔
if((p=head=(struct s *)malloc(sizeof(struct s)))==NULL){//申请空间
printf("Application memory failure, exit...\n");//申请失败则退出
return 0;
}
for(p-》next=head,p-》x=i=1;i《n;i++){//链表结点置1并构成环链表
if(p-》next=(struct s *)malloc(sizeof(struct s))){
p=p-》next;
p-》x=1;
p-》next=head;//构成环链表就把最后结点的下一结点设为第一个结点
}
else{//若某结点申请失败则释放已申请结点并退出
printf("Application memory failure, exit...\n");
dellink(head);//释放已申请结点
return 0;
}
}
for(i=1,t=k=0,p=head;k《n;p=p-》next,++t)//按题设次序对前n个结点清0
if(p-》x && i++%m==0)
p-》x=0,k++;
printf("%d\n",t%n);//输出最后清0的编号
dellink(head);//释放整个链表
return 0;
}
else
printf("Input error, exit...\n");
return 0;
}
c语言怎么解决约瑟夫问题
我自己写的直接用一维数组解决\x0d\x0a#include<*****>\x0d\x0a#define N 9 //总人数\x0d\x0a#define K 1 //开始数数的人\x0d\x0a#define M 3 //间隔的人数\x0d\x0a\x0d\x0a//给数组赋值\x0d\x0avoid setDate(int a);\x0d\x0adeleted(a,dm,len);//将被剔除的孩子从数组中删除\x0d\x0adm=dm+M-1;//下一个被剔除的孩子\x0d\x0alen--;//数组的长度减1\x0d\x0aif(dm’ i="m;" k,int="" len="N;\x0d\x0aint" len)\x0d\x0a{\x0d\x0aint="" m)\x0d\x0a{\x0d\x0aint="" m,int="" play(int="" 删除被选中的孩子\x0d\x0avoid="">=len) dm=dm-len;\x0d\x0a}\x0d\x0aprintf("最后一个孩子是%d.",a=i+1;\x0d\x0a}\x0d\x0a>*****>
求解约瑟夫环问题 C语言
链表方法
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p-》link=head
解决问题的核心步骤:
1.建立一个具有n个链结点,无头结点的循环链表
2.确定第1个报数人的位置
3.不断地从链表中删除链结点,直到链表为空
void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
{
/* p为当前结点 r为辅助结点,指向p的前驱结点 list为头节点*/
LinkList p,r,list;
/*建立循环链表*/
for(int i=0,i《n,i++)
{
p=(LinkList)malloc(sizeof(LNode));
p-》data=i;
if(list==NULL)
list=p;
else
r-》link=p;
r=p;
}
p》link=list; /*使链表循环起来*/
p=list; /*使p指向头节点*/
/*把当前指针移动到第一个报数的人*/
for(i=0;i《k;i++)
{
r=p;
p=p-》link;
}
/*循环地删除队列结点*/
while(p-》link!=p)
{
for(i=0;i《m-1;i++)
{
r=p;
p=p-》link;
}
r-》link=p-》link;
printf("被删除的元素:%4d ",p-》data);
****(p);
p=r-》link;
}
printf("\n最后被删除的元素是:%4d",P-》data);
}
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("\n"); /*打印链表,并检查循环链表是不输入正确*/
p=list;
i=1;
while(p&&i《k)
{ r=p;
p=p-》next;
++i;
}
for(i=1;i《n;i++)
{
for(j=1;j《m;j++)
{ r=p;
p=p-》next;
}
printf("The out=%d\n",p-》data);
r-》next=p-》next;
}
}
void main()
{
int x, y, z;
printf("input the lenth n\n");/*n,k,m分别代表总的人数,第一个报数的人,间隔的人数*/
scanf("%d",&x);
printf("input the start k\n");
scanf("%d",&y);
printf("input the m\n");
scanf("%d",&z);
JOSEPHU(x,y,z);
}
约瑟夫问题c语言
1、约瑟夫问题:Joseph问题的一种描述是:编号为1、2、……、n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
2、例程:
#include
#include
typedef int ElemType;
typedef struct LNode{
ElemType data;int num;
struct LNode *next;
}LNode,*LinkList;
void CreateList_L(LinkList *L,int n)
{ int i=0;
ElemType e;
LinkList p,q;
*L=(LinkList)malloc(sizeof(LNode));
(*L)-》 next=NULL;(*L)-》 data=n;
q=*L;
while(i
data=e;p-》 num=i+1;
p-》 next=NULL;
q-》 next=p;
q=p;
i++;
}
p-》 next=(*L)-》 next;
}
void PrintList(LinkList L)
{ int i=0;
LinkList p;
p=L-》 next;
while(i
data)
{
printf("%5d",p-》 data);
p=p-》 next;
i++;
}
printf("\n");
}
void Put(LinkList *L)
{ int i,m;LinkList p,q;
printf("input a number:\n");
scanf("%d",&m);
q=(*L)-》 next;
while((*L)-》 data)
{for(i=0;i
next;
}
printf("%5d",q-》 num);
m=q-》 data;
p-》 next=q-》 next;
****(q);
q=p-》 next;
(*L)-》 data=(*L)-》 data-1;
}
}
void main()
{LinkList L;
int a;
printf("请输入人数:");
scanf("%d",&a);
printf("请输入密码:");
CreateList_L(&L,a);
printf("您输入的数字为:\n");
PrintList(L);
Put(&L);
}
约瑟夫问题C语言代码修改
如果只是行尾多了个空格,简单地加个首行标记就可以了,非首行,在前面输出空格,修改如下:
PDATE
del(PDATE
p0)
{
static
int
sh=1;
if(!count)
{
printf("\n");
count=10;
sh=1;
}
if
(sh==1)
sh=0;
else
printf("
");
printf("%d",p0-》a);
....
约瑟夫问题c语言实现代码
测试结果:
总人数n=9,报数m=2.
2-》4-》6-》8-》1-》5-》9-》7-》3
#include《*****》
#include《*****》
typedef struct node
{
int data;
struct node *next;
}node;
typedef node* Linklist;
//原代码void CreatLinklist( Linklist *L,int n)
Linklist CreatLinklist(Linklist *L,int n)
{
Linklist p,s;
*L=(Linklist)malloc(sizeof(node));
(*L)-》next=NULL;
int i=1;
p=*L; //增加这个语句,让p指向当前结点
if(n!=0)
{
//原代码while(i《=41)
while(i《=n)
{
s=(Linklist)malloc(sizeof(node));
s-》data = i++;
p-》next = s;
p=s;
}
s-》next=(*L)-》next;//将链表循环起来;
}
****(*L);//释放头结点;
return s-》next;//返回第一个结点的值;
}
int main()
{
int n=41; //9
int m=3; //2
int i;
Linklist L;
printf("总人数n=%d,报数m=%d.\n",n,m);
//原代码Linklist *p = CreatLinklist(Linklist *L,int n);
Linklist p = CreatLinklist(&L,n);
Linklist temp;
m%=n;
while(p!=p-》next)
{
for(i=1;i《m-1;i++)
{
p=p-》next;
}
printf("%d-》",p-》next-》data);
temp=p-》next;
p-》next=temp-》next;
****(temp);
p=p-》next;
}
printf("%d",p-》data);
return 0;
}
数据结构(c语言)用线性表实现约瑟夫问题,求求大佬帮我看看怎么实现
#include 《*****》
#include 《*****》
#include 《*****》
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
//解决约瑟夫问题
int yue (int m, int n) {
//head指向不带头节点的循环单链表
LinkList head = NULL, cur, p, q;
int i, j;
//生成第一个节点
head = (LinkList) malloc (sizeof(LNode));
head-》data = 1;
head-》next = head;
//使用尾插法按顺序生成节点
p = head;
for (i=1; i《=m; i++) {
if (i==1) /* 首结点 */
p-》data = i; /* 向已存在的首结点写入编号 */
else {
q = (LinkList) malloc (sizeof(LNode)); /* 生成新结点 */
if(!q) /* 内存分配失败 */
exit (OVERFLOW);
q-》data = i; /* 为第i个人编号 */
p-》next = q; /* 将q链接到p之后,即表尾 */
q-》next = head; /* 将q链接到首结点之前 */
p = p-》next; /* p指向表尾 */
}
}
//约瑟夫开始
cur = head;
printf ("出列顺序:");
//循环m-1次
for(i = 1; i 《 m; i++) {
//每次循环开始计数
for (j=1; j《n-1; j++) /* 依次报数至n-1 */
cur = cur-》next;
q = cur-》next; /* q指向p的后继结点,q即报到k之人 */
cur-》next = q-》next; /* p的后继结点跨过q,指向q的后继结点 */
printf("%d\t", q-》data);
if (q == head) /* q是首结点 */
head = q-》next; /* 移动首结点 */
**** (q); /* 删除q结点 */
cur = cur-》next; /* p指向下一个结点 */
j--; /* 人数减一 */
}
putchar (’\n’);
//返回最后剩下的节点数据域,即为最后剩下的人
return cur-》data;
}
int main (void) {
printf ("最后剩下的人:%d\n", yue (8, 3)); //8个人,报3者出列
//运行结束后,需要销毁链表,此处略
getch (); /* 屏幕暂留 */
return 0 ;
}
编写c语言程序解决约瑟夫问题,要求不用递归算法
楼主你好!
下面这个就是关于约瑟夫问题的题目,代码(不是递归的)及题目已经给出,希望对你有帮助!
原题:
n个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定n个人围成一圈,由第1个人数起,依次报数,数到第m人,便把他投入大海中,然后再从他的下一个人数起,数到第m人,再将他扔到大海中,如此循环地进行,直到剩下k个乘客为止。问哪些位置是将被扔下大海的位置。
#include《*****》
#include《*****》
struct list{ //定义链表的节点结构
int number; //用于给乘客的位置编号
struct list*next;
};
main(){
int i,n; //n表示人数,i用于for循环
struct list*head=NULL,*p,*q,*temp,*r;
printf("请输入船上的人数n:\n");
scanf("%d",&n);
for(i=1;i《=n;i++){ /*根据人数n,建立带头结点head循环链表*/
p=(struct list*)malloc(sizeof(struct list));
p-》number=i; //给每位乘客位置编号
if(head==NULL){head=p;}
else {q-》next=p;}
q=p;
}
p-》next=head;
r=head;
int m,k,a=0; //m表示乘客数到这个需要下船的数,k表示最终船上剩余的乘客人数,a用于记录乘客总共报数的次数
printf("请输入数到需要下船的数m\n");
scanf("%d",&m);
printf("请输入最终船上剩余人数k\n");
scanf("%d",&k);
while(r!=NULL&&n!=k){
++a;
if((a+1)%m==0){ /*找出需下船乘客的前一位乘客,将需下船的乘客的节点删除,并将与下船乘客的相邻的两位乘客节点连起来,保证认是一个循环链表 */
temp=r-》next;
r-》next=r-》next-》next;
printf("编号为%d位置的乘客需要下船!\n",temp-》number); //输出下船乘客的位置编号
****(temp);
n--;
}
else r=r-》next;
}
}
更多文章:
约瑟夫问题c代码(数据结构中的约瑟夫环问题用C语言怎么编写出来啊)
2026年4月30日 22:40
json无线网初始密码(ajax jsonData 怎么传两个json 格式的数据吗)
2026年4月30日 22:20
length函数c++中怎么用(s.length()的C++代码是什么意思)
2026年4月30日 21:40
vue textarea高度自适应(随着输入文字的多少,textarea自动变化高度)
2026年4月30日 21:00
repository和mapper(java怎么拦截mapper方法)
2026年4月30日 20:00




