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...