C語言 猴子選大王問題

2021-10-10 08:44:38 字數 1960 閱讀 8952

pta基礎程式設計題目集 7-28

猴子選大王

題目簡介:

一群猴子要選新猴王。新猴王的選擇方法是:讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

輸入格式:

輸入在一行中給乙個正整數n(≤1000)。

輸出格式:

在一行中輸出當選猴王的編號。

輸入樣例:

11輸出樣例:

7

題解思路:

第一步:

建立乙個結構體:

typedef

struct node st,

*pst;

//st等價於struct node st; *st等價於struct node* st;

關於mark:

令沒被去掉的猴子的 mark 值為 0 ;被去掉的猴子的 mark 值為 1 ;

關於mark_start:令第乙個結點的 mark_start 為 0 ;其餘結點均為 1;

關於mark_end:

令最後乙個結點的 mark_end 為 0 ;其餘結點均為 1;

第二步:

建立乙個迴圈鍊錶

第三步:

根據題目要求對這個迴圈鍊錶進行相對應的操作

操作其實也很簡單,就是判斷該鍊錶內mark==0的個數,直到個數為1,跳出迴圈,然後遍歷尋找這個mark為 0 的資料就可以了

需要注意的時,我們要對mark==0 的個數進行更新 ;

思路就是這樣,**如下;

//建立乙個鍊錶,用函式對鍊錶進行遍歷、插入、刪除、排序

#include

#include

#include

//使用 bool 函式需要加這個標頭檔案

typedef

struct node st,

*pst;

//st等價於struct node st; *st等價於struct node* st;

pst creat_list

(void

) end->mark_end =0;

//結尾的標誌為0

end->next = phead;

//建立迴圈鍊錶

return phead;

}int

length_list

(pst phead)

if(p->mark_end ==0)

return len;

}int

update_length

(pst head)

}else

p = p->next;}}

return len;

}void

delete_list

(pst p)

else

q = q->next;

while

(q->mark ==1)

}}}}

}void

search

(pst p)

else

if(q->mark_end ==0)

else}}

}int

main

(void

)else

}//printf("長度 %d", len);

評測:

(C語言)猴子選大王

問題描述 要從n只猴子中選出一位大王。它們決定使用下面的方法 n只猴子圍成一圈,從1到n順序編號。從第q只猴子開始,從1到m報數,凡報到m的猴子退出競選,下一次又從退出的那只猴子的下乙隻開始從1到m報數,直至剩下的最後乙隻為大王。請問最後哪只猴子被選為大王。輸入形式 控制台輸入三個整數n,m,q 輸...

猴子選大王問題

猴子選大王 亞瑟夫換 的問題是資料結構和演算法中常見的一類問題。可以使用迴圈佇列實現,也可以使用鍊錶實現。還可以使用陣列的回溯法實現。m只猴子要選大王,選舉辦法如下 所有猴子按1,2 n編號圍成一圈,從第一號開始順序1,2 m,凡是報m號的退出圈外,如此迴圈報數直到圈內只剩乙隻猴子時這只猴子就是大王...

猴子選大王問題

創立乙個記錄編號的陣列,用指標在這個陣列迴圈移動計數,當計數為m時將這個元素做移除標記,直到剩下最後乙個元素。1 intmain 211 int p v 0 12 int z 0,x 1,co 1 z為剔除元素個數,x為元素在陣列中位置,co為計數 13for 1423 p 24 x 25 26if...