吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言-有趣的約瑟夫問題及解決辦法

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-09-23 11:13 ? 次閱讀

今天給大家講講約瑟夫問題是什么,并且我提供了一種約瑟夫問題的解決辦法。對于不知道約瑟夫是誰的人來說,就更不用提什么是約瑟夫問題了。那么問題來了,約瑟夫是誰,約瑟夫問題又是個什么東西。

首先來個解釋吧,約瑟夫問題,有時也稱為約瑟夫置換,是一個出現在計算機科學和數學中的問題。特別是對于學習過數據結構的人來說,在書上看到解決這個問題的題目,可能都不下5遍吧。在計算機編程算法中,類似的問題又稱為約瑟夫環或者丟手絹問題

約瑟夫(Josephus)是誰,約瑟夫是著名的猶太歷史學家,那么約瑟夫問題又是個什么東西呢。其實我并不太清楚約瑟夫的什么生平經歷,但是關于約瑟夫問題,倒是有一個小故事給大家講一講,這個故事就是約瑟夫問題的原型。好了,下面來個大家講故事了,據說在羅馬人占領喬塔帕特后,39個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。

從上面的故事,大家至少可以知道,約瑟夫雖然是個歷史學家,但是他的數學學的也不賴嘛。

約瑟夫問題并不難,求解的方法也非常的多,我這里提供一個循環鏈表的解決方法,為什么用循環鏈表,因為我看那個故事里面的人都是手拉手圍成一個圓圈的嘛。

下面是我寫的程序源代碼,大家看看,就知道是怎么解決的了:

注:可以通過修改mian()函數中的StartCountlength這3個參數來改變游戲的規則,大家可以試試。

#include
#include

/*
*功能:約瑟夫問題解決辦法(循環鏈表解決)
*By:AilsonJack
*Date:2014.05.24
*/
#defineerror0
#defineok1

typedefintElementType;
typedefstructCycleListNodeNode;
typedefstructCycleListNode*ptrNode;

structCycleListNode//循環鏈表結點
{
ElementTypedata;//數據區
ptrNodenext;//指向下一個結點
};

//函數聲明
//約瑟夫問題解決辦法(循環鏈表解決)
voidJosephus(ptrNodelist,intstart,intcount,intlength);

//創建循環鏈表頭結點
intCycleList_CreateNode(ptrNode*list);

//初始化循環鏈表,并且最后丟掉鏈表頭結點,鏈表的數據為1->length
voidCycleList_Init(ptrNode*list,intlength);

//刪掉循環鏈表中從表頭數的第position個位置的數據
//最終將頭結點變為刪除前那個結點的下一個結點
voidCycleList_Delete(ptrNode*list,intposition);

//查找循環鏈表中數據元素是Start的結點的位置,并且將該節點設為新的起始結點s
voidCycleList_Find(ptrNode*list,ElementTypeStart);

//打印循環鏈表中的數據
voidPrin_CycleList(ptrNodelist,intlength);

intmain(void)
{
intStart=1;//起始計數位置
intCount=3;//第Count個位置的結點出局
intlength=41;//循環鏈表的長度
ptrNodelist;

CycleList_CreateNode(&list);
CycleList_Init(&list,length);
Prin_CycleList(list,length);
Josephus(list,Start,Count,length);

while(1)
{
}

return0;
}

//約瑟夫問題解決辦法(循環鏈表解決)
voidJosephus(ptrNodelist,intstart,intcount,intlength)
{
inti=1;

CycleList_Find(&list,start);
printf("
約瑟夫問題解決開始....
");

while(i<=?length)
????{
????????CycleList_Delete(&list,count);
i++;
}

printf("
約瑟夫問題解決結束
");
}

//創建循環鏈表頭結點
intCycleList_CreateNode(ptrNode*list)
{
*list=(ptrNode)malloc(sizeof(structCycleListNode));
if(*list==NULL)
{
printf("OutofSpace...
");
returnerror;
}

(*list)->next=NULL;

returnok;
}//初始化循環鏈表,并且最后丟掉鏈表頭結點,鏈表的數據為1->length
voidCycleList_Init(ptrNode*list,intlength)
{
inti=1;
ptrNodenewNode;
ptrNodeFirstNode;
FirstNode=*list;

while(i<=?length)//i從1到length
{
newNode=(ptrNode)malloc(sizeof(structCycleListNode));
newNode->data=i;
(*list)->next=newNode;
(*list)=newNode;
i++;
}

(*list)->next=FirstNode->next;
*list=FirstNode->next;
}

//刪掉循環鏈表中從表頭數的第position個位置的數據
//最終將頭結點變為刪除前那個結點的下一個結點
voidCycleList_Delete(ptrNode*list,intposition)
{
inti=1;
ptrNodetmp;

if(position==1)
{
tmp=*list;
while(tmp->data!=(*list)->next->data)
{
*list=(*list)->next;
}
printf("%d",(*list)->next->data);
(*list)->next=tmp->next;
*list=tmp->next;
free(tmp);
tmp=NULL;
}
else
{
while(i-1))
{
(*list)=(*list)->next;
i++;
}

tmp=(*list)->next;
printf("%d",tmp->data);
(*list)->next=(*list)->next->next;
free(tmp);
tmp=NULL;
*list=(*list)->next;
}
}

//查找循環鏈表中數據元素是Start的結點的位置,并且將該節點設為新的起始結點
voidCycleList_Find(ptrNode*list,ElementTypeStart)
{
while((*list)->data!=Start)
{
*list=(*list)->next;
}
}

//打印循環鏈表中的數據
voidPrin_CycleList(ptrNodelist,intlength)
{
inti=1;

printf("打印循環鏈表...
");

while(i<=?length)
????{
????????printf("%d",list->data);
list=list->next;
i++;
}

printf("
結束打印
");
}

下面是程序的運行結果:

345b147e-59b7-11ee-939d-92fbcf53809c.png

2015-03-31_165155

以上就是對約瑟夫問題的解決方法啦,大家有不明白的可以留言喲。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137735
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62978
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40232

原文標題:C語言-有趣的約瑟夫問題及解決辦法

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    華碩筆記本聲卡驅動無法安裝的解決辦法

    華碩筆記本聲卡驅動無法安裝的解決辦法
    發表于 01-18 10:10 ?3573次閱讀

    聲卡硬件維修的常見問題及解決辦法

    聲卡硬件維修的常見問題及解決辦法 常見故障一:聲卡無聲   出現這種故障常見的原因有:
    發表于 02-23 14:25 ?2586次閱讀

    誤碼特性,誤碼產生的機理及解決辦法

    誤碼特性,誤碼產生的機理及解決辦法
    發表于 03-19 17:10 ?2292次閱讀

    UPS電源輸入跳閘淺析及解決辦法

    UPS電源輸入跳閘淺析及解決辦法解析
    發表于 11-10 16:42 ?89次下載
    UPS電源輸入跳閘淺析及<b class='flag-5'>解決辦法</b>

    Matlab編程常見錯誤與解決辦法

    Matlab編程常見錯誤與解決辦法求人不如求己
    發表于 03-16 15:58 ?0次下載

    壓榨輥軸承位磨損有哪些解決辦法

    壓榨輥軸承位磨損有哪些解決辦法
    發表于 01-19 09:45 ?4次下載

    ESP32勘誤表及解決辦法

    電子發燒友網站提供《ESP32勘誤表及解決辦法.pdf》資料免費下載
    發表于 09-23 11:51 ?0次下載
    ESP32勘誤表及<b class='flag-5'>解決辦法</b>

    電腦右鍵管理打開失敗的解決辦法

    此電腦右鍵管理打不開怎么辦 電腦右鍵管理打開失敗的解決辦法
    發表于 09-28 09:56 ?0次下載

    J-Link連接MCU失敗解決辦法

    J-Link連接MCU失敗解決辦法
    的頭像 發表于 10-18 17:43 ?1212次閱讀
    J-Link連接MCU失敗<b class='flag-5'>解決辦法</b>

    硬盤故障的3個終極解決辦法

    電子發燒友網站提供《硬盤故障的3個終極解決辦法.pdf》資料免費下載
    發表于 10-20 10:46 ?0次下載
    硬盤故障的3個終極<b class='flag-5'>解決辦法</b>

    細碎機軸承位磨損問題的解決辦法

    【設備故障】細碎機軸承位磨損問題的解決辦法
    發表于 10-27 16:36 ?0次下載

    Protel99 與WIN10系統沖突解決辦法

    PROTEL99 與WIN10系統沖突解決辦法
    的頭像 發表于 11-20 09:30 ?4281次閱讀
    Protel99 與WIN10系統沖突<b class='flag-5'>解決辦法</b>

    Profinet IO通信故障的解決辦法

    Profinet IO通信故障可能由多種原因引起,以下是一些常見的通信故障及其解決辦法
    的頭像 發表于 03-08 11:27 ?1241次閱讀

    常見MCU故障及解決辦法

    微控制器單元(MCU)是現代電子設備中的核心組件,負責處理和控制各種功能。然而,由于各種原因,MCU可能會出現故障。以下是一些常見的MCU故障及其解決辦法: 1. 電源問題 故障現象: MCU無法
    的頭像 發表于 11-01 13:41 ?2761次閱讀

    常見墊圈故障及解決辦法 防漏墊圈的設計與應用

    常見墊圈故障及解決辦法 1. 墊圈老化 故障現象: 墊圈因長時間使用而老化,失去彈性,導致密封性能下降。 解決辦法: 定期檢查墊圈的老化情況,及時更換新的墊圈。 2. 墊圈變形 故障現象: 由于安裝
    的頭像 發表于 12-12 15:31 ?468次閱讀
    网上百家乐官网公式| 百家乐官网网址多少| 现金百家乐官网攻略| 赌百家乐赢的奥妙| 公海百家乐的玩法技巧和规则| 海立方娱乐城线路| 百家乐官网澳门色子| 怎么玩百家乐能赢钱| 澳门顶级赌场百家乐| 百家乐官网塑料扑克牌盒| 太阳城百家乐怎么出千| 德州扑克发牌员| 网络百家乐官网必胜投注方法| 哪个百家乐投注好| 娱网棋牌官方下载| 送彩金百家乐官网平台| 百家乐娱乐求解答| 明光市| 丽景湾百家乐官网的玩法技巧和规则 | 罗浮宫百家乐官网的玩法技巧和规则 | 百家乐路单怎样| 文水县| 百家乐游戏试玩免费| 博狗博彩网站,| 唐人街百家乐官网的玩法技巧和规则 | 连环百家乐官网的玩法技巧和规则| 百家乐改单软件| 百家乐官网代理网址| 百家乐赢钱公式冯耕| 沿河| 百家乐游戏软件出售| 速博国际网上娱乐| 真人百家乐口诀| 优博平台代理开户| 百家乐娱乐城代理| 爱拼百家乐| 百家乐官网开闲的几率多大| 大发888官方hgx2dafa888gwd| 百家乐官网小路规则| 大发888娱乐城客服电话| 博彩百家乐官网后一预测软件 |