當前位置:首頁 » 編程語言 » 約瑟夫c語言

約瑟夫c語言

發布時間: 2023-05-24 12:20:27

① 用c語言實現約瑟夫環

正好之前寫過基礎的約瑟夫環,稍作修改就可以滿足你的題目

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

typedefstruct_node{
intid;
intkey;
struct_node*next;
}Linklist;

intmain(){
intn,m;
scanf("%d%d",&n,&m);
inti,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 ",head->id);
free(head);
return0;
}

② C語言約瑟夫問題

約瑟夫問題:
#include<iostream.h>
struct
node
{
int
data;
node
*pnext;
};
void
main()
{
int
n,k,m,i;
node
*p,*q,*head;
cout<<"輸入n的值:";
cin>>n;
cout<<"輸入起始報數人號碼k的值:";
cin>>k;
cout<<"輸入
數到m出列的m的值:";
cin>>m;
head=(node*)new
node;
//確定頭結點
p=head;
for(i=1;i<=n-1;i++)
//賦初值
{
p->data=i;
p->pnext=(node*)new
node;
//為下一個新建內存
p=p->pnext;
}
p->data=n;
//最後一個單獨處理
p->pnext=head;
//指向頭,形成循環鏈表
p=head;
while(p->data!=(p->pnext)->data)
//p->data==(p->pnext)->data表示只剩下一個結點的
{
while(p->data
!=k)
//尋找編號為k的結點
p=p->pnext;
if(m==1)
{
for(i=1;i<=n;i++)
{
cout<<p->data<<'\\t'
;
p=p->pnext
;
}
cout<<'\
';
return;
}
else
for(i=1;i<m-1;i++)
//開始報數
{p=p->pnext;}
//找到報m-1的結點
q=p->pnext;
//q為報m的結點
cout<<q->data<<"\\t";
//輸出報m的結點的值
k=(q->pnext)->data;
//k為下一個報數的起點
p->pnext=q->pnext;
//刪除報m的結點
}
cout<<p->data<<'\
';
//輸出最後一個結點的值
}

③ c語言約瑟夫(Joseph)問題

#include <stdio.h>
#include <stdlib.h>
/*n表示最初有多少個人,銀嘩碰m表示報數到多少的人離開,函數Joseph返回最後剩下的人的編號*/
int Joseph(int n, int m)
{
int count = n; /*count表示當前圈內剩下的人數*/
int num=0; /*num表示當前報的數*/
int i,j; /*i表示當前報數的人對應的下標*/
int *a, remain;
/*動態申請連續的n個存儲單元用來鋒談存放每個人的編號,將空間首地址賦值給a*/
a = (int *)malloc(sizeof(int));
for(i=0; i<n; i++) a[i] = i+1; /*a[i]保存第i個人的編號*/
i = 0; /*從下標為0的人開始報數*/
while(count>1) /*如果剩餘人數大於1則循環蘆者*/
{
num++;
if(num == m) /*報數到m的人離開*/
{
/*將下標為i的元素刪除*/
for(j=i+1; j<count; j++) a[j-1] = a[j];
count--; /*當前剩餘人數減1*/
num = 1; /*下一個人重新從1開始報數*/
}
i = m%count; /*計算下一個要報數的人的下標*/
}
remain = a[0]; /*最後只剩下一個人,將其編號賦值給remain*/
return remain;
}

④ 約瑟夫問題c語言實現代碼

測試結果:

總人數n=9,報數m=2.
2->4->6->8->1->5->9->7->3


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

typedefstructnode
{
intdata;
structnode*next;
}node;

typedefnode*Linklist;

//原代碼voidCreatLinklist(Linklist*L,intn)
LinklistCreatLinklist(Linklist*L,intn)
{
Linklistp,s;
*L=(Linklist)malloc(sizeof(node));
(*L)->next=NULL;
inti=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;//將笑賣鏈表循環起來;
}
free(*L);//釋放頭結點;
returns->next;//返回第一個結點的值;
}

intmain()
{
intn=41;//9
intm=3;//2
inti;
LinklistL;

printf("總人數n=%d,報數m=%d. ",n,m);

//原代碼Linklist*p=CreatLinklist(Linklist*L,intn);
Linklistp=CreatLinklist(&L,n);
Linklisttemp;

早升笑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;
free(temp);
p=p->next;
}
printf("%d",p->data);
return0;
}

⑤ 約瑟夫環(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開始記。

⑥ c語言怎麼解決約瑟夫問題

我自己寫的直接用一維數組解決
#include<stdio.h>
#define N 9 //總人數
#define K 1 //開始數數的人
#define M 3 //間隔的人數

//給數組賦值
void setDate(int a[],int n)
{ int i;
for(i=0;i<n;i++)
a[i]=i+1;
}
//刪除被選中的孩子
void deleted(int a[],int m,int len)
{
int i=m;
do
{
a[i]=a[i+1];
i++;
}while(i<len);
}

//開始play
void play(int a[],int k,int m)
{
int len =N;
int dm=k+m-2;//第一個被剔除的孩子
while(len!=1)
{printf("第%d個孩子被剔除。\n",a[dm]);
deleted(a,dm,len);//將被剔除的孩子從數組中刪除
dm=dm+M-1;//下一個被剔除的孩子
len--;//數組的長度減1
if(dm>=len) dm=dm-len;
}
printf("最後一個孩子是%d.",a[0]);//最後一個孩子被放在a[0]中
}
main()
{
int a[N];
setDate(a,N);
play(a,K,M);

}

⑦ 如何用C語言解約瑟夫環

按你表達的意思,如果原來每3個刪除一個正確的話,把if(3=...)體中的count = 0;改為count = 1;就可以了。因為題意就變為「第一次隔3刪除,以後隔2刪除」了。

⑧ 約瑟夫問題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;
free(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語言

"*"表示當前數起位置

#include <stdio.h>
int main()
{
int n;
int i, j;
int pos[30];
for(i = 0; i < 30; i++) pos[i] = i+1; //位置輸入到數組
i = 0;
n = 30;
while(n > 15){
i += 8;
i %= n;
printf("扔下第 %d 人\n", pos[i]);
n --;
for(j = i; j < n; j++){
pos[j] = pos[j+1];
}
printf("剩下的人: ");
for(j=0;j<n;j++) {
if(j == i) printf("*%d ", pos[j]);
else printf("%d ", pos[j]);
}
printf("\n");

}
return 0;
}

輸出:
扔下第 9 人
剩下的人: 1 2 3 4 5 6 7 8 *10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
扔下第 18 人
剩下的人: 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 *19 20 21 22 23 24 25 26 27 28 29 30
扔下第 27 人
剩下的人: 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 *28 29 30
扔下第 6 人
剩下的人: 1 2 3 4 5 *7 8 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 28 29 30
扔下第 16 人
剩下的人: 1 2 3 4 5 7 8 10 11 12 13 14 15 *17 19 20 21 22 23 24 25 26 28 29 30
扔下第 26 人
剩下的人: 1 2 3 4 5 7 8 10 11 12 13 14 15 17 19 20 21 22 23 24 25 *28 29 30
扔下第 7 人
剩下的人: 1 2 3 4 5 *8 10 11 12 13 14 15 17 19 20 21 22 23 24 25 28 29 30
扔下第 19 人
剩下的人: 1 2 3 4 5 8 10 11 12 13 14 15 17 *20 21 22 23 24 25 28 29 30
扔下第 30 人
剩下的人: 1 2 3 4 5 8 10 11 12 13 14 15 17 20 21 22 23 24 25 28 29
扔下第 12 人
剩下的人: 1 2 3 4 5 8 10 11 *13 14 15 17 20 21 22 23 24 25 28 29
扔下第 24 人
剩下的人: 1 2 3 4 5 8 10 11 13 14 15 17 20 21 22 23 *25 28 29
扔下第 8 人
剩下的人: 1 2 3 4 5 *10 11 13 14 15 17 20 21 22 23 25 28 29
扔下第 22 人
剩下的人: 1 2 3 4 5 10 11 13 14 15 17 20 21 *23 25 28 29
扔下第 5 人
剩下的人: 1 2 3 4 *10 11 13 14 15 17 20 21 23 25 28 29
扔下第 23 人
剩下的人: 1 2 3 4 10 11 13 14 15 17 20 21 *25 28 29

⑩ 求解約瑟夫環問題 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);
free(p);
p=r->link;
}
printf("\n最後被刪除的元素是:%4d",P->data);
}

熱點內容
ct4哪個配置性價比最高 發布:2025-05-19 15:38:02 瀏覽:952
如何設置強緩存的失效時間 發布:2025-05-19 15:21:28 瀏覽:695
winxp無法訪問 發布:2025-05-19 15:19:48 瀏覽:947
文件預編譯 發布:2025-05-19 15:14:04 瀏覽:643
怎麼在伺服器上掛公網 發布:2025-05-19 15:14:02 瀏覽:272
濟南平安e通如何找回密碼 發布:2025-05-19 14:56:58 瀏覽:176
安卓手機如何找到iccid碼 發布:2025-05-19 14:46:51 瀏覽:227
編譯的內核為什麼那麼大 發布:2025-05-19 14:45:21 瀏覽:179
什麼控制壓縮 發布:2025-05-19 14:28:13 瀏覽:931
網路伺服器忙指什麼 發布:2025-05-19 14:28:10 瀏覽:189