1. 程式人生 > >C語言解決約瑟夫環問題 詳細註釋

C語言解決約瑟夫環問題 詳細註釋

約瑟夫環演算法是: n 個人圍成一圈,每個人都有一個互不相同的密碼,該密碼是一個整數值,選擇一個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下一個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退出圈子。重複上面的過程,直到剩下最後一個人。

/*約瑟夫環*/
#include <stdio.h>
#include <stdlib.h>

#define N 9  //環中人的個數
#define OVERFLOW 0
int KeyW[N]={4,7,5,9,3,2,6,1,8};  //每個人手中的密碼

typedef struct LNode{  //定義迴圈連結串列
    int keyword;
    struct LNode * next;
}LNode,*LinkList;

void Joseph(LinkList p,int m,int x){  //x為總人數,m為刪除的那個人手中的密碼,起始的m為第一個人手中的密碼
    LinkList q;
    int i;
    if(x==0)return;
    q=p;
    m%=x;
    if(m==0)m=x;
    for(i=1;i<=m;++i){  //找到第m個人  p指向要刪除的人的前一人 q指向要刪除的人
        p=q;
        q=p->next;
    }
    p->next=q->next;  //刪除q
    i=q->keyword;  //得到下一個要刪除的人的位置
    printf("%d ",q->keyword);
    free(q);
    Joseph(p,i,x-1);  //遞迴呼叫 總人數減1,輸入新的密碼
}

int main()
{
    int i,m;
    LinkList Lhead,p,q;  //Lhead指向頭,p指向尾指標,q指向新建指標
    Lhead=(LinkList)malloc(sizeof(LNode));
    if(!Lhead)return OVERFLOW;
    Lhead->keyword=KeyW[0];
    Lhead->next=NULL;
    p=Lhead;
    for(i=1;i<9;++i){
        if(!(q=(LinkList)malloc(sizeof(LNode)))) return OVERFLOW;
        q->keyword=KeyW[i];  //對q的keyword進行賦值
        p->next=q;  //將q賦給p的next
        p=q;  //p要指向尾部,將q賦給p
    }
    p->next=Lhead;  //構造迴圈連結串列
    printf("請輸入第一次計數值m :\n");
    scanf("%d",&m);
    printf("輸出的佇列是:\n");
    Joseph(p,m,N);
    return 0;
}


------沒有別人聰明,就請付出更多的努力------

相關推薦

C語言解決問題 詳細註釋

約瑟夫環演算法是: n 個人圍成一圈,每個人都有一個互不相同的密碼,該密碼是一個整數值,選擇一個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下一個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退

(演算法)C語言模擬問題

約瑟夫環問題描述 m個人圍坐一圈,每人持有一個數字,從第一個人開始從1報數,報到n(第一輪n任意給定)的人出圈,將n改為這個出圈的人所持有的數字,下個人開始從1報數,繼續報到n的人出列;依次類推直到所有

C語言解決問題演算法

據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,4

c語言實現-每隔幾個刪除一個,求剩下的

c語言連結串列實現約瑟夫環的程式碼,每隔任意元素刪除一個,逐步輸出各個刪除元素 #include<stdio.h> #include<malloc.h> #include<string.h> #define N 10 struct lno

用循鏈表解決問題

循環 解決 使用 end head als list output 循環條件 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規

單循鏈表 解決的問題

malloc 表示 重復 printf 約瑟夫 ext std head eof 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的

c++提問】問題

ocl wmi lsa rul 2dx hdp and kml eee 家煩堵zx1ul秩枷言http://weibo.com/u/6221316968部坎夢8t970帕糖良http://weibo.com/u/6378557985兜杉稚k9v00劑重凸http://wei

用迴圈連結串列解決的問題

約瑟夫環問題簡介  約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出

PHP解決的問題

//準備好41個人 $people = array(); for($i=0;$i<=40;$i++) { $people[] = $i+1; } /** * @param $people 準備好的陣列 * @param $step 每到第幾個人,會把他殺掉 * @p

php解決

轉載 https://www.cnblogs.com/china90/p/7367396.html 今天偶遇一道演算法題 “約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它

C語言問題)

約瑟夫問題 問題一: #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } ListNode; typedef ListNod

php通過迴圈鏈解決

本想著用php寫些資料結構提升一下,寫到鏈的時候看到約瑟夫環問題,嘗試用迴圈鏈寫了一下 約瑟夫環: 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又

連結串列解決問題

第一次做約瑟夫環問題,歡迎大家來找茬~ 如果做單迴圈連結串列時有點暈了,要畫圖要畫圖要畫圖,重要的事講三遍,因為真的是很好的方法。 #include<stdio.h> #include<stdlib.h> typedef struc

C++vector實現

//向量求解約瑟夫環 #include <iostream> #include <vector> #include <iomanip> using namespace std; int main() {int n, m;cin >&

使用連結串列解決的問題

已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列,問最後一個出環的人的原編號。 用在單鏈表中刪除一個結點的思想

使用連結串列解決問題

1139 約瑟夫環問題 時間限制:500MS 記憶體限制:65536K 提交次數:157 通過次數:79 題型: 程式設計題 語言: G++;GCC Description 約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次

URAL 1521 War Games 2 樹狀陣列解決,輸出離隊順序

In accordance with this scheme, the war games are divided into N phases; and N soldiers, successively numbered from 1 to N, are marching round a circle on

C語言處理問題(丟手絹)

(部分經驗援引自其他人)問題描述:     在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重

靜態連結串列解決問題

#include<stdio.h> #define MAXSIZE 100  struct {  int  cur ;  int  number;  int  secret_node; }space[MAXSIZE]; int main(void) {  int

利用陣列解決問題

約瑟夫環問題描述:編號為1,2… n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數的上限值m,從第一個人開始按順時針方向自1開始順序報數, 報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他的順時針方向上的下一個開始重新從1報數,如此下去,直至所有人全部出列為