C語(yǔ)言版約瑟夫問題算法實(shí)現(xiàn)
1、問題描述:
? ? ? ?有n個(gè)人圍坐一圈,現(xiàn)從第s個(gè)人開始報(bào)數(shù),數(shù)到m的人出列,接著從出列的下一個(gè)人開始重新報(bào)數(shù),數(shù)到m的人又出列.如此下去,直到所有人都出列為止.試設(shè)計(jì)確定他們出列次序序列的程序
2、算法步驟:
????????1、確定存儲(chǔ)結(jié)構(gòu):n個(gè)人圍成一圈,故使用循環(huán)單鏈表來存儲(chǔ)序號(hào)
????????2、算法實(shí)現(xiàn):
該問題共n、m、s三個(gè)未知量,所以可以通過三個(gè)循環(huán)來實(shí)現(xiàn),第一個(gè)循環(huán)用來確定最開始第一個(gè)報(bào)數(shù)的人的指針位置(單鏈表的頭節(jié)點(diǎn)指針指向第s個(gè)人),第二個(gè)循環(huán)用來控制輸出序號(hào)的次數(shù)(共n次),第三個(gè)循環(huán)用來數(shù)數(shù)(每一次循環(huán)使指針移動(dòng)m次)
3、實(shí)現(xiàn)源代碼:
# include <stdio.h> # include <malloc.h> typedef struct Node { int number; struct Node * pNext; }NODE, *PNODE; PNODE creat_list(int n); int main (void) { int n,m,s; printf("約瑟夫環(huán)問題:\n"); printf("設(shè)有n(編號(hào)為“0 1 2 3 .....n-1 n”)個(gè)人圍坐一圈,現(xiàn)從第s個(gè)人開始報(bào)數(shù),數(shù)到m的人出列,\n求最后的出列順序。\n"); printf("請(qǐng)?jiān)O(shè)置n, s, m :\n"); printf("n = "); scanf("%d", &n); printf("s = "); scanf("%d", &s); printf("m = "); scanf("%d", &m); //問題引導(dǎo)提示代碼段 PNODE pHead = NULL; pHead = creat_list(n); pHead->number = 1; //創(chuàng)建單鏈表 PNODE p = pHead; //定義頭指針 int i,j,k; //定義循環(huán)參數(shù) for(j = 1; j < s; j++) { p = p->pNext; } //第一個(gè)循環(huán)確定第一個(gè)報(bào)數(shù)的人在循環(huán)單鏈表中的位置 for(i = 1; i <= n; i++) //外部循環(huán)代表遍歷到最后一個(gè)所需要的循環(huán)次數(shù) { for(k = 1; k < m; ) //內(nèi)部循環(huán)代表遍歷出列的人 { if(p -> pNext -> number != 0) { p = p -> pNext; k++; } else { p = p -> pNext; } } printf("%d ",p -> number); p -> number = 0; do { p = p -> pNext; }while(p -> number == 0); } printf("\n"); return 0; } PNODE creat_list(int n) //單鏈表的創(chuàng)建 { PNODE pHead = (PNODE)malloc(sizeof(NODE)); PNODE pTail = pHead; int i; for(i = 2; i <= n; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->number = i; pTail->pNext = pNew; pNew->pNext = pHead; pTail = pNew; } return pHead; }
到此這篇關(guān)于C語(yǔ)言版約瑟夫問題算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言約瑟夫問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VScode + keil開發(fā)環(huán)境搭建安裝使用過程
這篇文章主要介紹了VScode + keil開發(fā)環(huán)境搭建及安裝使用過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07C++中Digraphs、Trigraphs和Tokens的深入講解
這篇文章主要給大家介紹了關(guān)于C++中Digraphs、Trigraphs和Tokens的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06C++結(jié)構(gòu)體作為函數(shù)參數(shù)傳參的實(shí)例代碼
這篇文章主要介紹了C++結(jié)構(gòu)體作為函數(shù)參數(shù)傳參的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析
這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),該函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值2013-09-09詳解C++中StringBuilder類的實(shí)現(xiàn)及其性能優(yōu)化
在Java和C#中,StringBuilder可以創(chuàng)造可變字符序列來動(dòng)態(tài)地?cái)U(kuò)充字符串,那么在C++中我們同樣也可以實(shí)現(xiàn)一個(gè)StringBuilder并且用來提升性能,下面就來詳解C++中StringBuilder類的實(shí)現(xiàn)及其性能優(yōu)化2016-05-05C語(yǔ)言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08