問題:設有n個人圍成乙個圓圈,現從第s個人開始報數,數到第m的人出列,然後從出列的下乙個人重新開始報數,數到第m的人再次出列,如此反覆,直到所有的人全部出列為止。對於任意給定的n、s、m,求按出列次序得到的n個人員的序列。
例:
就是問題簡單示例,裡面是每次要迴圈的資料,後面的s是出列的人
思路:
先建立乙個鍊錶,鍊錶的長度就是n
從第s個節點開始迴圈
判斷是否是第m個數
如果是第m個數,就輸出並刪除當前節點
迴圈到最後乙個節點,再從第乙個節點接著迴圈
主要**:
void yuesefu (linklist * head, int n, int s, int m)
l++;
q = q->next;
}//從下乙個節點開始迴圈
p = getdata_linklist(head, l);
j--;
}else
//如果超出鍊錶長度,再從第乙個節點開始迴圈
if (p == null)
p = head->next;
i++; }
}
整體**:
#include #include typedef int elemtype;
typedef struct node
linklist;
//建立鍊錶
linklist * create_linklistf(int n)
return head;
}//按序號查詢
linklist * getdata_linklist (linklist * head, int i)
if (i == j)
return p;
else
return null;
}//刪除節點
int deletenode_linklist (linklist * head, int i)
else }
void yuesefu (linklist * head, int n, int s, int m)
l++;
q = q->next;
}//從下乙個節點開始迴圈
p = getdata_linklist(head, l);
j--;
}else
//如果超出鍊錶長度,再從第乙個節點開始迴圈
if (p == null)
p = head->next;
i++; }
}int main (void)
用C鍊錶實現約瑟夫環問題
問題 設有n個人圍成乙個圓圈,現從第s個人開始報數,數到第m的人出列,然後從出列的下乙個人重新開始報數,數到第m的人再次出列,如此反覆,直到所有的人全部出列為止。對於任意給定的n s m,求按出列次序得到的n個人員的序列。就是問題簡單示例,裡面是每次要迴圈的資料,後面的s是出列的人 思路 先建立乙個...
鍊錶實現約瑟夫環問題
約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從1開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌剩下最後乙個人,求那個人的位置。總體思路 1 建立鍊錶 用尾插法建立 2 當人數大於...
Problem E 用鍊錶實現約瑟夫環
你聽說過約瑟夫問題嗎?問題大致如下 首先n個人圍成乙個圈,標記為1到n號。接著,從1號開始報數 從1開始 然後2號報數,然後3號。當有人報到到m時,這個人就要踢出比賽,然後從被踢出的人的下乙個人開始,重新報數 從1開始 這樣經過n 1次後,就只剩下了乙個人,問最後剩下的那個人是幾號?第1行為t,表示...