題目描述
設有n個人圍坐一圈並按順時針方向從1到n編號,從第1個人開始進行1到m的報數,報數到第個m人,此人出圈,再從他的下乙個人重新開始1到m的報數,如此進行下去直到所剩下一人為止。
輸入
輸入多行,每行2個數,分別表示n和m.
輸出
計算每一行中最後剩下這個人的編號.
樣例輸入
10 3
樣例輸出
4
解題思路:
這其實就是約瑟夫環問題。此題很經典,也有很多很好的解法。剛好最近我複習了一下鍊錶,就用簡單的單向非迴圈鍊錶練一下手^^。
詳細**如下:
//此題為約瑟夫環問題
#include #include typedef struct link link;
link *createlist(int n)
tail->next = null;
return head;
}void deletelist(link *p, int x) // 刪除第x個結點
if(p != null)
}int main()
if(i == n)
}printf("%d\n", p->next->pos);
free(p);
}return 0;
}
**還是比較清晰明了的。需要注意的一些地方:
1. n按輪數減小。我並沒有在有人淘汰出圈後立即將n減小(立即減小會出錯),而是引入了count累計,直到完整的一輪(1~n)結束後再縮小n的範圍。
2.鍊錶逢m減小。這就使得每輪鍊錶的長度總是小於等於n,且大多數情況鍊錶長度小於n,即每輪中鍊錶長度等於 n - count。所以某一輪中的第i個座位對應的其實是鍊錶上的第(i-count)個位置。
C 單向迴圈鍊錶
pragma once include using namespace std template class t class singlecircularlinklist template class t class node friend ostream operator ostream os,n...
無頭單向非迴圈鍊錶
首先建立乙個標頭檔案存放所需要的函式功能的宣告slist.h ifndef slist h define slist h include include include include typedef int sltdatatype typedef struct slistnodeslistnode...
單向迴圈鍊錶C語言實現
我們都知道,單向鍊錶最後指向為null,也就是為空,那單向迴圈鍊錶就是不指向為null了,指向頭節點,所以下面這個程式執行結果就是,你將會看到遍歷鍊錶的時候就是乙個死迴圈,因為它不指向為null,也是周而復始的執行。串成了乙個環型。include include typedef struct nod...