當前位置:首頁 » 編程語言 » 約瑟夫環順序表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);
}

熱點內容
android開發發展 發布:2025-01-09 23:15:36 瀏覽:283
sw裝配體怎麼選擇零件配置 發布:2025-01-09 23:13:17 瀏覽:209
如何進入華為的伺服器 發布:2025-01-09 23:11:37 瀏覽:853
安卓日歷每月提醒怎麼設置 發布:2025-01-09 23:07:53 瀏覽:387
安卓手機qq怎麼備份 發布:2025-01-09 23:07:12 瀏覽:958
kettle源碼下載 發布:2025-01-09 23:01:36 瀏覽:733
casejava 發布:2025-01-09 22:56:56 瀏覽:699
oracle如何導出資料庫 發布:2025-01-09 22:55:13 瀏覽:771
編程ppm 發布:2025-01-09 22:49:25 瀏覽:729
蒸汽之都偵探安卓按鍵在哪裡 發布:2025-01-09 22:48:30 瀏覽:819