当前位置:首页 » 编程语言 » 约瑟夫环顺序表c语言

约瑟夫环顺序表c语言

发布时间: 2022-02-16 10:21:30

1. 约瑟夫环(求助c语言高手)

运行过了,结果是编号为2的人。
#include<stdio.h>
main(){
int a[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
int count = 17;
int last = 0;
while(count > 1){
int num = 0;
while(num<6){
if(a[last%17]!=0)
num++;
last++;
}
while(a[last%17]==0)
last++;
a[last%17] = 0;
while(a[last%17]==0)
last ++;
count--;
int i;
for(i=0;i<17;i++)
printf("%d ", a[i]);
printf("\n");
}
}

每次结果:0为罚下的人,1为依然在场的人。
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1
1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1
1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1
1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1
1 1 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1
1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1
1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0
1 1 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0
1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0
1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2. 约瑟夫环c语言

/*josephus_clist.c*/
/*Josephus问题:循环链接表实现*/

#include <stdio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE 1
typedef int DataType; /* 定义元素类型为整型,也可定义为其他类型 */
struct Node; /* 单链表结点类型 */
typedef struct Node *PNode; /* 结点指针类型 */
struct Node /* 单链表结点结构 */
{ DataType info;
PNode link;
};

typedef struct Node *LinkList;
typedef LinkList *PLinkList;

int init_clist( PLinkList pclist, int n )
/* 用1,2,……,n为*pclist所示的循环表初始化 */
{ PNode p,q;
int i;
q = (PNode)malloc( sizeof( struct Node ) );
if ( q == NULL ) return ( FALSE );
*pclist=q;
q->info = 1;
q->link = q;
if (n==1) return (TRUE);
for(i=2;i<n+1;i++)
{ p=(PNode)malloc(sizeof(struct Node));
if (p==NULL) return(FALSE);
p->info=i;
p->link=q->link;
q->link=p;
q=p;
}
return (TRUE);
}

void josephus_clist( PLinkList pclist, int s,int m )
{PNode p,pre;
int i;
p=*pclist;
/* 找第s个元素 */
if (s==1)
{pre =p;
p=p->link;
while (p!=*pclist)
{
pre =p;
p=p->link;
}
}
else for(i=1;i<s;i++)
{
pre =p;
p=p->link;
}
while (p!=p->link) /* 当链表中结点个数大于1时 */
{ for (i=1;i<m;i++) /* 找第m个结点 */
{ pre = p;
p = p->link;
}
printf(“ out element: %d \n”,p->info); /* 输出该结点 */
if (*pclist ==p) /* 该结点是第一个结点时,删除时需特殊处理一下 */
*pclist =p->link;
pre->link = p->link; /* 删除该结点 */
free(p);
p = pre->link;
}
printf(“ out element: %d \n”,p->info); /* 输出最后一个结点 */
*pclist=NULL;
free(p);
}

main( )
{LinkList jos_clist;
int n,s,m;
/* 输入所需各参数的值 */
do{
printf(“\n please input the values of n = “);
scanf(“%d”,&n);
}while (n<1);
do{
printf(“ please input the values of s = “);
scanf(“%d”,&s);
}while (s<1);
do{
printf(“ please input the values of m = “);
scanf(“%d”,&m);
}while (m<1);
if (init_clist(&jos_clist,n))
josephus_clist(&jos_clist,s,m);
else
printf(“Out of space!\n”);
}

3. 约瑟夫环 c语言

约瑟夫环问题的源程序如下:
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{ int data;
struct node *next;
}JD;
JD *xhlbjl(JD *front, JD *rear,int n)
{ /*建立循环队列*/
int i;

front=(JD *)malloc(sizeof(JD));
front->data=n; /*头指针指向n号*/
front->next=front;
for (i=n-1;i>0;i--)
{ rear=(JD *)malloc(sizeof(JD));
rear->data=i;
rear->next=front->next;
front->next=rear;
}
return(front);
}

JD *outqueue(JD *front, JD *rear,int m) /*出队列*/
{int i,s;

for (i=0;i<s-1;i++)
front=front->next;
return(front);
}
main()
{ JD *h,*p,*q,*s;
int i,j,m,n;
printf("请输入人数 ");
scanf("%d",&n);
h=xhlbjl( p,q,n);
p=h->next;
printf("坐成一圈的人是: ");
for(i=1;i<=n;i++)
{ printf("%3d",p->data);
p=p->next;
}
printf("\n请输入开始位置 ");
scanf("%d",&s);
printf("数几个出去 ");
scanf("%d",&m);
s=outqueue(p,q,m);

q=s;
p=s->next;
for(j=0;j<n;j++)
{ for (i=1;i<m;i++)
{ q=p;
p=p->next;
}
printf("\n出列的人是第 %d 号",p->data);
q->next=p->next;
free(p);
p=q->next;
}

}
http://..com/question/14741820.html?si=1

4. 约瑟夫环(c语言)

怎么了,代码看不懂?

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
首先我们列出一些有关约瑟夫环的结果:
1 1 2 2 3 2 4 1 5 4 6 1 7 4 8 7 9 1 10 4
11 7 12 10 13 13 14 2 15 5 16 8 17 11 18 14 19 17 20 2021 2 22 5 23 8 24 11 25 14 26 17 27 20 28 23 29 26 30 29
31 1 32 4 33 7 34 10 35 13 36 16 37 19 38 22 39 25 40 28
41 31 42 34 43 37 44 40 45 43 46 46 47 2 48 5 49 8 50 11
51 14 52 17 53 20 54 23 55 26 56 29 57 32 58 35 59 38 60 41
61 44 62 47 63 50 64 53 65 56 66 59 67 62 68 65 69 68 70 171 4 72 7 73 10 74 13 75 16 76 19 77 22 78 25 79 28 80 31
81 34 82 37 83 40 84 43 85 46 86 49 87 52 88 55 89 58 90 61
91 64 92 67 93 70 94 73 95 76 96 79 97 82 98 85 99 88 100 91
意思是,前一个数为约瑟夫环的人数,后一个数为最后出去的人的号码。
从上面的表中我们可以归纳出以下两个规则:
规则1:若上一组数字中最后保留号比人数少一,则下一数从1开始记。
例如第三组(3,2)为上一组,最后保留好为2,比3少1,下一组的数字(4,1),最后保留号为1
规则2:若上一组数字为最后保留号与人数相等,则下一数从2开始记。

5. C语言 约瑟夫环

代码一:
#include<stdio.h>
#define N 13

struct person
{
int number;
int nextp;
}link[N+1];

void main()
{
int i,count,h;
for(i=0;i<=N;i++)
{
if(i==N)
link[i].nextp=1;
else
link[i].nextp=i+1;
link[i].number=i;
}
printf("\n");
count=0;
h=N;
printf("sequence that persons leave the circle:\n");
while (count<N-1)
{
i=0;
while(i!=3)
{
h=link[h].nextp;
if(link[h].number)
i++;
}
printf("%4d",link[h].number);
link[h].number=0;
count++;
}
printf("\nThe last one is");
for(i=1;i<=N;i++)
if(link[i].number)
printf("%3d",link[i].number);
printf("\n");
}

代码二:
void Josephus(int n,int m,int s)
//使用带表头附加节点的循环单链表为空
{
//生成表头附加结点,此时循环单链表为空
LNode* HL=new LNode;
HL->next=HL;
int i;
//生成含n个结点的,结点值依次为1-n的带表头附加结点的循环表
for(i=n;i>=1;i--)
//生成新结点
LNode* newptr=new LNode;
newptr->data=i;
//新结点插入到表头
newptr->next=HL->next;
HL->next=newptr;
}
//从表头开始顺序查找出第s个结点,对应第1个开始报数的人
LNode *ap=HL,*cp=HL->next;
for(i=1;i<s;i++){
//ap和cp指针后移一个位置
ap=cp;
cp=cp->nextl
//若cp指向了表头附加的结点,则仍需后移指针,使之指向表头结点
if(cp==HL){ap=HL;cp=HL->next;}
}
//依次使n-1个人出列
for(i=1;i<n;i++)
//顺序查找出待出列的人,即为循环结束后cp所指向的结点
for(int j=1;j<m;j++)
{
ap=cp;
cp=cp->next;
if(cp==HL){ap=HL;cp=HL->next;}
}
//输出cp结点的值,即出列的人
cout<<cp->data<<" ";
//从单链表中删除结点的后继结点
cp=ap->next;
//若cp指向了表头附加结点,则后移ap和cp指针
if(cp==HL){ap=HL;cp=HL->next;}
}
//使最后一个人出列
cout<<HL->next->data<<endl;
//删除表头结点和表头附加结点
delete HL->next;
delete HL;
}

6. C语言分别使用顺序表和链表实现约瑟夫问题

源代码就不复制过来了。
网络“约瑟夫问题”,第一个结果“约瑟夫问题_网络”
http://ke..com/link?url=-GG8SpNCoYsiplW4QA18cD1xg18FU_QPZu6qNxWR7b5a
里面有各种各样的解法,以及各种编程语言的解法。

7. C语言约瑟夫环问题

#include<stdio.h>

#defineN17//人数
#defineM11//出局人号码

voidmain()
{
inta[N],i,call_n=0,out_n=0;
for(i=0;i<N;i++)a[i]=0;
i=0;
while(1){//循环报数
if(a[i]==0){//如果健在
if(out_n==(N-1))break;//如果仅剩一人
call_n++;//报数
call_n%=M;//最大为M,到了M就从0开始
if(call_n==0){
a[i]=1;//出局标记
out_n++;
printf("%d",i+1);//显示出局人号码
}
}
i++;i%=N;//循环转向下一人
}
printf(" 最后剩余者的编号是:%d ",i+1);
}

8. 用顺序表解决约瑟夫环问题,用C++实现该算法

# include <stdio.h>
# define SIZE 20
int joseph(int a[],int m,int n)
{
int b[SIZE];
int i;
int flag=0;
int code;
int sum=n;
int point=0;
int num=m;
for(i=0;i<n;i++)
{ b[i]=i+1; }
while(sum!=0)
{
for(i=1;i<=num;i++)
{ if(point>=sum) point=1;
else point++;
}
num=a[point-1];
code=b[point-1];
for(i=point;i<=sum;i++)
{ a[i-1]=a[i];
b[i-1]=b[i];
}
sum--;
flag++;
point--;
printf("已退出%d人,退出的人的编号为%d.\n",flag,code);
}
return 0;
}

main()
{
int m,n,i;
int array[SIZE];
printf("约瑟夫环求解,当前设置最大人数为%d.\n",SIZE);
printf("报数上限:\n");
scanf("%d",&m);
printf("总人数为:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("第%d人的密码为:",i+1);
scanf("%d",&array[i]);
}
joseph(array, m, n) ;
return 0;
}

9. c语言顺序表约瑟夫环,怎么给顺序表赋值

你在往创建链表函数传递参数时写的是结点指针的引用。而你main函数里体用该函数时写的是结点的引用。所以在main函数应该这么写
void main()
{ int n,m;
SqList *L;//此处为定义一个结点指针
printf("请输入人数n和初始值m:\n");
scanf("%d%d",&n,&m);
GreateList(L,n);
DisplayList(L,m);//此处不需要引用符号
DestroyList(L);
}

热点内容
ftp服务器功能 发布:2025-01-10 07:48:33 浏览:80
java如何运行程序 发布:2025-01-10 07:25:53 浏览:562
冒险岛电脑连接服务器失败 发布:2025-01-10 07:23:01 浏览:824
安卓开发要学什么语言 发布:2025-01-10 07:21:30 浏览:21
绍兴编程培训 发布:2025-01-10 07:16:53 浏览:300
java接口和类 发布:2025-01-10 07:09:14 浏览:403
discuzforlinux安装 发布:2025-01-10 07:09:10 浏览:229
招行支票密码器口令是多少 发布:2025-01-10 06:55:27 浏览:353
好的解压拓展实力怎么样 发布:2025-01-10 06:49:18 浏览:699
租服务器会自带公网ip么 发布:2025-01-10 06:49:17 浏览:348