C语言编程求解约瑟夫问题

C语言编程求解约瑟夫问题,第1张

约瑟夫环的问题,我给你一个,程序首先输入小孩子个数,然后输入W

首先输出每个小孩子的编号,然后输出出列的数序,最后输出留下的小孩的编号

#include<stdioh>

int Josephus(int Child,int n,int m);

void main()

{

int allChild,j,k,l;

scanf("%d%d",&j,&k);

//cin>>j>>k;

if((allChild= new int[j])!=NULL)

{

for(l=0;l<j;l++)

{

printf("%d,",l+1);

//cout<<l+1<<",";

allChild[l]=l+1;

}

printf("\n");

//cout<<endl;

printf("%d",Josephus(allChild,j,k));

//cout<<Josephus(allChild,j,k);

}

}

int Josephus(int Child,int n,int m)

{

int i=-1,j=0,k=1;

while(1)

{

for(j=0;j<m;)

{

i=(i+1)%n;

if(Child[i]!=-1)

j++;

}

if(k==n)

break;

//cout<<Child[i]<<",";

printf("%d,",Child[i]);

Child[i]=-1;

k=k+1;

}

printf("\n");

//cout<<endl;

return(Child[i]);

}

我这有个类似的,你根据你的需求改一下就可以了

—————————————————————————

#include<stdioh>

#include<malloch>

typedef struct tagRing_t

{

int Num;

struct tagRing_t pnext;

}Ring_t;

int InitRing(Ring_t pstRing)

{

pstRing = (Ring_t )malloc(sizeof(Ring_t));

if (NULL == pstRing)

{

return 0;

}

(pstRing)->Num = 1;

(pstRing)->pnext = pstRing;

return 1;

}

int CreateRing(Ring_t pstRing, int iNum)

{

int i = 0;

Ring_t pstTemp = NULL, pst = NULL;

if (iNum < 1)

{

return 0;

}

pstTemp = pstRing;

for (i = 0; i < iNum; i++)

{

if (0 == i)

{

(pstRing)->Num = 1;

}

else

{

pst = (Ring_t )malloc(sizeof(Ring_t));

if (NULL == pst)

{

return 0;

}

pst->Num = i + 1;

pstTemp->pnext = pst;

pst->pnext = pstRing;

pstTemp = pstTemp->pnext;

}

}

return 1;

}

int DeleteNode(Ring_t pstRing, int s, int iNum)

{

int i = 0;

Ring_t pstTemp = pstRing, pst = NULL;

while (pstTemp->pnext != pstRing)

{

pstTemp = pstTemp->pnext;

}

for (i = 1; i < s; i++)

{

pstTemp = pstTemp->pnext;

}

while (pstTemp->pnext != pstTemp)

{

for (i = 1; i < iNum; i++)

{

pstTemp = pstTemp->pnext;

}

pst = pstTemp->pnext;

pstTemp->pnext = pst->pnext;

printf(" %d ", pst->Num);

free (pst);

pst = NULL;

}

printf(" %d\n", pstTemp->Num);

free (pstTemp);

pstTemp = NULL;

return 1;

}

int main()

{

Ring_t pstRing = NULL;

int n = 0, s = 0, m = 0;

InitRing(&pstRing);

printf("请输入n, s 和 m的值:");

scanf("%d %d %d", &n, &s, &m);

CreateRing(&pstRing, n);

printf("出列顺序为: ");

DeleteNode(&pstRing, s, m);

return 1;

}

正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目

#include <stdioh>

#include <stdlibh>

typedef struct _node {

    int id;

    int key;

    struct _node next;

} Linklist;

int main() {

int n, m;

scanf("%d %d", &n, &m);

int i, count = 0;

Linklist head = (Linklist)malloc(sizeof(Linklist)), tail = head;

head->id = 1;

scanf("%d", &head->key);

head->next = head;

for(i = 2; i <= n; i++) {

Linklist p = (Linklist)malloc(sizeof(Linklist));

p->id = i;

scanf("%d", &p->key);

p->next = head;

tail->next = p;

tail = p;

}

while(head != tail) {

if(++count % m) {

tail = head;

} else {

    m = head->key;

    count = 0;

printf("%d ", head->id);

tail->next = head->next;

free(head);

}

head = tail->next;

}

printf("%d\n", head->id);

free(head);

return 0;

}

楼主好,约瑟夫问题的

程序如下:

#include<stdioh>

int

main()

{

int

i,k,m,n,num[50],p;

int

n;

printf("输入两个数字n和m:\n");

scanf("%d",&n);

while(scanf("%d",&n)!=eof)

{

if(n==0)

return

0;

else

{

p=num;

for(i=0;i<n;i++)

(p+i)=i+1;

i=0;

k=0;

m=0;

}

while(m<n-1)

{

if((p+i)!=0)

k++;

if(k==n)

{

(p+i)=0;

k=0;

m++;

}

i++;

if(i==n)i=0;

}

while(p==0)

p++;

printf("%d\n",p);

}

}

望采纳哦~~

#include<iostream>

using namespace std;

struct Node//循环节点的定义

{

int number;//编号

Node next;

};

Node CreateList(Node L,int &n,int &m);//建立约瑟夫环函数

void Joseph(Node L,int n,int m);//输出每次出列号数函数

Node DeleteList(Node L,int i,Node q);//寻找每次出列人的号数

int LengthList(Node L);//计算环上所有人数函数

void main()//主函数

{

Node L;

L=NULL;//初始化尾指针

int n, m;

cout<<"请输入人数N:";

cin>>n;//环的长度

if(n<1){cout<<"请输入正整数!";}//人数异常处理

else

{

cout<<"请输入所报数M:";

cin>>m;

if(m<1){cout<<"请输入正整数!";}//号数异常处理

else

{

L=CreateList(L,n,m);//重新给尾指针赋值

Joseph(L,n,m);

}

}

system("pause");

}

Node CreateList(Node L,int &n,int &m)//建立一个约瑟夫环(尾插法)

{

Node q;

for(int i=1;i<=n;i++)

{

Node p;

p=new Node;

p->number=i;

p->next=NULL;

if(i==1) L=q=p;//工作指针的初始化

else

{

q->next=p;

q=q->next;

}

}

q->next=L;

if(L!=NULL){return(L);}//返回尾指针

else cout<<"尾指针异常!"<<endl;//尾指针异常处理

}

void Joseph(Node L,int n,int m)//输出每次出列的人

{

int k;

cout<<"请输入第一个报数人:";

cin>>k;

if(k<1||k>n){cout<<"请输入1-"<<n<<"之间的数"<<endl;}

else

{

cout<<"\n出列顺序:\n";

for(int i=1;i<n;i++)

{

Node q = new Node;

if(i==1) q=DeleteList(&L,k+m-1,q);//第一个出列人的号数

else q=DeleteList(&L,m,q);

cout<<"号数:"<<q->number<<endl;

delete q;//释放出列人的存储空间

}

cout<<"最后一个出列号数是:"<<L->number<<endl;;//输出最后出列人的号数

}

}

Node DeleteList(Node L,int i,Node q) //寻找每次出列的人

{

if(i==1) i+=LengthList(L);//顺序依次出列情况的处理方式

Node p;

p=L;

int j=0;

while(j<i-2) {p=p->next;j++;}

q = p->next;

p->next=p->next->next;

L = p->next;

return(q);

}

int LengthList(Node L)//计算环上的人数

{

if(L){cout<<"尾指针错误!"<<endl;}//异常处理

else

{

int i=1;

Node p=L->next;

while(p!=L)

{

i++;

p=p->next;

}

return(i);

}

}

首先,p是指向头结点的,或者说第一个结点,然后:

p->next = p; //p->next也指向头结点,也就是头结点的next指向自己,那么一开始只有一个结点时这就已经是一个循环链表了,后面再插入结点时只要尾结点的next指向头结点,就能保持它仍然是循环链表。

node r = p;//用r来指向尾结点,r=p,因为p->next=p,所以也就是r->next==p,尾结点的next指向头结点。

for循环中:

q->next = r->next;//把新增结点的next指向头结点,其实等价于q->next=p,因为r->next==p,尾结点的next是指向头结点的。

r->next = q;//把原先的尾结点的next指向新增结点。

r = q;//把尾结点改为新增结点,因为上面已经将新增结点的next指向头结点,所以这个 *** 作过后,尾结点的next仍然指向头结点,也就保持了链表仍然是循环链表。

以上就是关于C语言编程求解约瑟夫问题全部的内容,包括:C语言编程求解约瑟夫问题、约瑟夫问题(c语言)、用c语言实现约瑟夫环等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9522592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存