約瑟夫環 不用鍊錶的一般c程式

2021-06-26 06:44:20 字數 988 閱讀 4901

約瑟夫環

約瑟夫環(

約瑟夫問題

)是乙個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。它也是演算法設計中乙個老生常談的問題,有迴圈鍊錶法、陣列法、數學分析法等。

鍊錶法:充分利用迴圈鍊錶的迴圈特性,也是最容易想到、最容易實現的一種,前提是對鍊錶要有充分的了解,對指標操作不感冒;

數學分析法:不考慮演算法問題,將約瑟夫環抽象為乙個單純的數學問題,通過數學推理,可得到乙個簡單的數學公式,x'=(x+k)%n,這種方法演算法設計極簡單,但對數學推導功底要求較高;

陣列法:為常規一般的程式設計方法,通過陣列元素的增減處理,借助合理的邏輯設計達到的設計演算法。符合常規演算法設計思維,但對邏輯思維要求較高。

考慮到網上、書籍中多以鍊錶法居多,我們就用陣列法實現:

演算法:

step1、一群人圍在一起坐成環狀(如:n)

step2、從某個編號開始報數(如:k)

step3、數到某個數(如:m)的時候,此人出列,下乙個人重新報數

step4、一直迴圈,直到所有人出列,約瑟夫環結束,輸出最後剩下的人的編號

程式設計如下:

#include

int main()

aimindex=startindex-2;

while(total-1)

else

} for(i=aimindex;i

for(i=0;i

printf("###\n");

aimindex-=1;

total--; }

printf("the last number is

:%d\n",a[0]);

printf("-------------------------\n");

return  0; }

一般線性鍊錶類的C 實現

以下的c 類linklist實現了線性鍊錶的一般操作。可以直接在其他的程式中直接建立它的物件,其中線性表中的資料在此為整型,具體應用的時候可以適當的修改,並可以在此基礎上繼續封裝特定的功能。標頭檔案 linklist.h typedef struct lnode lnode,plinklist cl...

一般線性鍊錶類的C 實現

以下的c 類linklist實現了線性鍊錶的一般操作。可以直接在其他的程式中直接建立它的物件,其中線性表中的資料在此為整型,具體應用的時候可以適當的修改,並可以在此基礎上繼續封裝特定的功能。標頭檔案 linklist.h typedef struct lnode lnode,plinklist cl...

C 一般處理程式

string username context.request.querystring txtname 接收的是表單元素name屬性的值 string userpwd context.request.querystring txtpwd string username context.request...