约瑟夫问题c代码(数据结构中的约瑟夫环问题用C语言怎么编写出来啊)

:暂无数据 2026-04-30 22:40:01 0
读懂本文,您将不仅了解约瑟夫问题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代码的任何后续问题,欢迎通过[联系方式]找到我们。
本文编辑:admin

更多文章:


redis doc(redis开个线程扫过期订单)

redis doc(redis开个线程扫过期订单)

你是否好奇,为什么人人都在谈redis doc?它和redis开个线程扫过期订单之间究竟存在着怎样微妙的联系?答案就在下文。

2026年4月30日 23:00

约瑟夫问题c代码(数据结构中的约瑟夫环问题用C语言怎么编写出来啊)

约瑟夫问题c代码(数据结构中的约瑟夫环问题用C语言怎么编写出来啊)

读懂本文,您将不仅了解约瑟夫问题c代码是什么,更能洞悉数据结构中的约瑟夫环问题用C语言怎么编写出来啊背后的逻辑,从而举一反三。

2026年4月30日 22:40

json无线网初始密码(ajax jsonData 怎么传两个json 格式的数据吗)

json无线网初始密码(ajax jsonData 怎么传两个json 格式的数据吗)

当大家谈论json无线网初始密码时,总免不了提及ajax jsonData 怎么传两个json 格式的数据吗。它们之间究竟有何玄机?读完本文你便了然于胸。

2026年4月30日 22:20

怎么升级ios15?苹果ios15系统哪些手机支持升级

怎么升级ios15?苹果ios15系统哪些手机支持升级

在了解ios15的过程中,您是否也曾对怎么升级ios15感到困惑?别担心,接下来我将结合常见场景,带您一步步理清其中的关键点。

2026年4月30日 22:00

length函数c++中怎么用(s.length()的C++代码是什么意思)

length函数c++中怎么用(s.length()的C++代码是什么意思)

大家好,如果您还对length函数c++中怎么用不太了解,没有关系,今天就由本站为大家分享length函数c++中怎么用的知识,包括s.length()的C++代码是什么意思的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年4月30日 21:40

作业指导书英文(来料加工手册 英文怎么说)

作业指导书英文(来料加工手册 英文怎么说)

当我们讨论作业指导书英文时,我们真正需要关注的是什么?很多高手的答案都指向了:来料加工手册 英文怎么说。为什么?

2026年4月30日 21:20

vue textarea高度自适应(随着输入文字的多少,textarea自动变化高度)

vue textarea高度自适应(随着输入文字的多少,textarea自动变化高度)

在了解vue textarea高度自适应的过程中,您是否也曾对随着输入文字的多少,textarea自动变化高度感到困惑?别担心,接下来我将结合常见场景,带您一步步理清其中的关键点。

2026年4月30日 21:00

items的中文(itms中文是什么意思)

items的中文(itms中文是什么意思)

大家好,如果您对items的中文还心存疑问,别着急,今天这篇文章就将围绕itms中文是什么意思为您展开详细解说。

2026年4月30日 20:40

pg数据库和mysql(数据库软件都有那些)

pg数据库和mysql(数据库软件都有那些)

想快速搞懂pg数据库和mysql吗?本文将围绕数据库软件都有那些等核心问题,用最直白的语言为您提供一份实用指南,帮您节省大量摸索的时间。

2026年4月30日 20:20

repository和mapper(java怎么拦截mapper方法)

repository和mapper(java怎么拦截mapper方法)

很多朋友初次接触repository和mapper可能会觉得有点陌生,这很正常。今天这篇文章,咱们就一起把java怎么拦截mapper方法这事儿聊透,希望能帮您理清思路。

2026年4月30日 20:00

最近更新

redis doc(redis开个线程扫过期订单)
2026-04-30 23:00:02 浏览:0
items的中文(itms中文是什么意思)
2026-04-30 20:40:02 浏览:0
repository和mapper(java怎么拦截mapper方法)
2026-04-30 20:00:01 浏览:0
热门文章

split函数 sql(求sql split函数的用法)
2026-03-26 20:40:01 浏览:1
mysql insert into字段顺序问题(mysql insert into的问题)
2026-04-13 16:00:02 浏览:1
标签列表