1. 程式人生 > >線性表的應用——約瑟夫環

線性表的應用——約瑟夫環

依稀記得學C語言的時候寫過這樣的程式碼來實現約瑟夫環(貌似期末的實驗考試就是抽到了這個題,我才不會告訴你我拿了100分捏)

#include <stdio.h>
void main()
{
    int n;
    printf("Input the number of person:");
    scanf("%d",&n);
    int num[50],*p=num;
    for(int i=0;i<n;i++)
        *(p+i)=i+1;//給每個人編號
    int k=0,m=0;//k報數時計數變數,m為退出人數
    i=0;//i為每次迴圈時計數變數
while(m<n-1)//還有超過1人未退出時,執行迴圈 { if(*(p+i)!=0) k++; if(k==3)//k=3了,有人應該出局了 { *(p+i)=0;//退出的人編號置為0 k=0;//一輪數數結束,k置為0 m++;//有人退出,m++ } i++;//使指標下移 if(i==n) i=0;//報數到最後一個編號,將i恢復為0 } while(*p==0) p++;//最後剩下來的人編號不=0,尋找這一個 printf
("The last one is %d\n",*p);//把編號不為0的編號輸出即可 }

學資料結構時老師給出了這樣的要求:
約瑟夫(Joseph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程式求出出列順序,利用單向迴圈連結串列儲存結構模擬此過程,按照出列的順序印出各人的編號。

// 實驗一_約瑟夫環.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "stdlib.h" typedef struct Person { int num; int pwd; Person *next; }; Person *head, *p, *q; int main() { int number; printf("請輸入參與人數:"); scanf("%d", &number); for (int i = 1; i < number+1; i++) { if (i==1) { head = p = (Person *)malloc(sizeof(Person)); } else { q = (Person *)malloc(sizeof(Person)); p->next = q; p = q; } p->num = i; printf("請輸入第%d個人的密碼:", i); scanf("%d", &(p->pwd)); } p->next = head; p = head; int password; printf("請輸入初始密碼:"); scanf("%d",&password); for (int i = 1; i < number+1; i++) { for (int j = 1; j < password; j++) { p = p->next; } printf("第%d個出局的人的編號是%d\n", i, p->num); password = p->pwd; p->num = p->next->num; p->pwd = p->next->pwd; p->next = p->next->next; } return 0; }

【測試資料】
m的初值為20;n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5)。

程式碼上完了,希望對你有幫組,哈哈哈

相關推薦

資料結構線性&&多項式求和&&差&&積&&導數&&給變數賦值小練習

問題描述 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常

線性的基本操作及其應用——

1.順序儲存 /* 程式執行後首先要求使用者輸入初始報數m,人數n,(設n≤10)。 上述程式中順序儲存的插入(或刪除)操作,鏈式結構上的插入(或刪除)操作。 */ #include<iostream> #define MAXSIZE 10//人數

線性應用——

依稀記得學C語言的時候寫過這樣的程式碼來實現約瑟夫環(貌似期末的實驗考試就是抽到了這個題,我才不會告訴你我拿了100分捏) #include <stdio.h> void main()

線性及其應用——問題

題目:約瑟夫環(Joseph) ① 問題描述:編號為1到n的n個人,按順時針方向圍成一個環,每人都持有一個密碼(正整數)。任選一個正整數作為報數的上限(設為m),從第一個人開始按順時針方向從1開始順序報數,當報到m時暫停報數,並將報數為m的人輸出,同時將他的密碼作為新的m值

應用——

hide creat rip urn nes scan hid fadein repr 題目: 報數,共n個人 從1編號,依次報號,報到m出隊,再接著從下一個人開始數,依次輸出出隊的人。 #include<stdio.h> #incl

數據結構(一)線性

cli amp tlist isp alloc 個人 pla 初始 ont (一)前提 41個人報數,1-3,當誰報數為3,誰就去嗝屁。現在獲取他們嗝屁的順序 (二)實現結構 順序:3->1->5->2->4 (三)代碼實現 #def

用循解決問題

循環 解決 使用 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的那個人又出列;依此規律重復下去,直到圓桌周圍的

單向循

data 單向 struct hit ++ main 指針 printf [] #include<stdio.h>#include<stdlib.h>#define N 10typedef struct node{ int data; st

使用順序求解問題 (自定義順序

約瑟夫環(Josephus)問題:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第s個人開始數起,每數到第d個犯人,就拉出來處決,然後再數d個,數到的人再處決……直到剩下的最後一個可赦免。當n=5,s=1,d=2,時: 第一步:定義一個順序表Se

順序(josephus)

1.問題描述         n個犯人站成一個圈,從第s個人開始數起,每數到第d個犯人,就拉出來斬了,然後再從下一個開始數d個,數到的人再處決,………………,直到剩下最後一個犯人就予以赦免。 2.演

使用順序求解問題

  //distance 想要第幾個出局.就傳入引數為幾 private static void josephus(int[] array,int distance){ ArrayList

單鏈實現

大家對約瑟夫環是比較陌生的,但是對於大多數人來說,丟手絹卻一點都不陌生,其實約瑟夫環和丟手絹差不多。 約瑟夫環 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出

HDOJ 1443 Joseph(打+數學—)

The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing

C/C++,資料結構單鏈實現

約瑟夫環——圍成一圈,定義一個數值K,從任意位置開始計數,每走K步刪除當前位置結點,直到剩下最後一個結點,求最後一個結點//單鏈表結構以及Find函式參見 2016-1-2 13:56 發表部落格SLi

[線性]

約瑟夫問題 約瑟斯置換 丟手絹問題 約瑟夫環 問題來歷 據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成

【資料結構演算法】問題(線性

據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺

C_線性----問題(迴圈連結串列)

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

資料結構考研複習--線性3(

約瑟夫環這個在一開始看的時候是一個相當蛋疼的問題,本節將為大家講述約約瑟夫環利用迴圈連結串列以及遞迴來進行求解 **約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從

線性Test2(

//已知num個人(以編號1,2,3...num分別表示)圍坐在一張圓桌周圍。從編號為point的人開始報數,數到point的那個人出列;他的下一個人又從1開始報數,數到point的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。求新的佇列成員的標號順序 //