C語(yǔ)言版約瑟夫問(wèn)題算法實(shí)現(xiàn)
1、問(wèn)題描述:
? ? ? ?有n個(gè)人圍坐一圈,現(xiàn)從第s個(gè)人開(kāi)始報(bào)數(shù),數(shù)到m的人出列,接著從出列的下一個(gè)人開(kāi)始重新報(bào)數(shù),數(shù)到m的人又出列.如此下去,直到所有人都出列為止.試設(shè)計(jì)確定他們出列次序序列的程序
2、算法步驟:
????????1、確定存儲(chǔ)結(jié)構(gòu):n個(gè)人圍成一圈,故使用循環(huán)單鏈表來(lái)存儲(chǔ)序號(hào)
????????2、算法實(shí)現(xiàn):
該問(wèn)題共n、m、s三個(gè)未知量,所以可以通過(guò)三個(gè)循環(huán)來(lái)實(shí)現(xiàn),第一個(gè)循環(huán)用來(lái)確定最開(kāi)始第一個(gè)報(bào)數(shù)的人的指針位置(單鏈表的頭節(jié)點(diǎn)指針指向第s個(gè)人),第二個(gè)循環(huán)用來(lái)控制輸出序號(hào)的次數(shù)(共n次),第三個(gè)循環(huán)用來(lái)數(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)問(wèn)題:\n");
printf("設(shè)有n(編號(hào)為“0 1 2 3 .....n-1 n”)個(gè)人圍坐一圈,現(xiàn)從第s個(gè)人開(kāi)始報(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); //問(wèn)題引導(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ǔ)言版約瑟夫問(wèn)題算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言約瑟夫問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pipes實(shí)現(xiàn)LeetCode(193.驗(yàn)證電話號(hào)碼)
這篇文章主要介紹了Pipes實(shí)現(xiàn)LeetCode(193.驗(yàn)證電話號(hào)碼),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
使用C語(yǔ)言實(shí)現(xiàn)繪制立體分離式環(huán)圖
這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言實(shí)現(xiàn)繪制立體分離式環(huán)圖的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03

