約瑟夫問題
//n個人圍圈報數,報m出列,最後剩下的是幾號?
#include
#include
typedef struct node
intdata;
structnode *next;
}node;
node *create(int n)
node*p = null, *head;
head= (node*)malloc(sizeof (node ));
p= head;
node*s;
inti = 1;
if(0 != n )
while(i <= n )
s= (node *)malloc(sizeof (node));
s->data= i++; // 為迴圈鍊錶初始化,第乙個結點為1,第二個結點為2。
p->next= s;
p= s; //這裡是先得到一塊記憶體,在下一次分配記憶體之後再填指標域的值。
s->next= head->next;
free(head);
returns->next ;
int main()
intn = 41;
intm = 3;
inti;
node*p = create(n);
node*temp;
m%= n; // m在這裡是等於2
while(p != p->next )
//控制條件,當這個節點的指標域指向自身時,說明只剩乙個節點
for(i = 1; i < m-1; i++)
p = p->next
[r1];
//此處,p是第二個節點的首位址
printf("%d->",p->next->data );
//此處,p->next是第三個節點的首位址
temp= p->next ;
//此處,temp是第三個節點的首位址[r2]
p->next= temp->next ;
//此處,temp->next是第四個節點的首位址
free(temp);
p = p->next ;
printf("%d\n",p->data );
return0;
[r1]1 p向後移動一位
2 p再向後移動一位
[r2]
p->next
把第四個節點的首位址賦值給p->next就是把第四個節點的首位址儲存在第二個節點的指標域中。
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...