線性表 約瑟夫問題(遞推未完)

2022-09-05 05:39:09 字數 1574 閱讀 4727

題目鏈結

總時間限制: 1000ms 記憶體限制: 65536kb

描述有n只猴子,按順時針方向圍成一圈選大王(編號從1到n),從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入n,m後,輸出最後猴王的編號。

輸入輸入包含兩個整數,第乙個是n,第二個是m (0 < m,n <=300)。

輸出輸出包含一行,即最後猴王的編號。

樣例輸入

12 4
樣例輸出

1
這道題是有好幾種解法的。

首先是陣列\鍊錶遍歷後刪除的演算法。

以上兩種的時間複雜度均為o(n*m);

3.陣列模擬

分析:先初始化整個陣列為1,接下來在迴圈中只對數值為1的進行計數,滿n置0,最後遍歷最後乙個數值為1的數,輸出其下標。

這種的時間複雜度最大,為o(n^2);

4.遞推演算法

待考試周過去後寫

1.鍊錶遍歷演算法

#include #include #define n 10000

typedef struct nodenode,*nodeptr;

void create(nodeptr head, int n )

last -> next = head -> next;

//printf("%p\t%p\t%p\t%p\n",null,head,last,last->next);

}void del(nodeptr prev, nodeptr &curr)

nodeptr josephus(nodeptr head,int m)

//printf("%d\n",head->data);

del(prev,head);

}free(temp);

return head;

}int main()

return 0;

}

2.靜態鍊錶演算法

#include #include #define n 10000

int main()

a[n] = 1;

int k = 0;

int prev;

while(a[k] != k)

a[prev] = a[k];

}printf("%d\n",k);

return 0;

}

3.陣列模擬演算法

#include #include #define n 350

int main()

if(i > n)

i = i%n;

}a[i-1] = 0;

if(i > n)

i = i%n;

times++;

}for(i = 1;i<=n;i++)

if(a[i] == 1)

break;

printf("%d\n",i);

return 0;

}

線性表的應用 約瑟夫環

依稀記得學c語言的時候寫過這樣的 來實現約瑟夫環 貌似期末的實驗考試就是抽到了這個題,我才不會告訴你我拿了100分捏 include void main i 使指標下移 if i n i 0 報數到最後乙個編號,將i恢復為0 while p 0 p 最後剩下來的人編號不 0,尋找這乙個 printf...

資料結構演算法 約瑟夫環問題(線性表)

這是我寫的第乙個部落格,目前讀大二,如果寫的有問題還請各位多多指教 眾所周知,約瑟夫環問題是乙個出現在電腦科學和數學中的問題,據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,...

資料結構Review 線性表練習(約瑟夫問題)

3 約瑟夫問題 10分 題目內容 有n只猴子,按順時針方向圍成一圈選大王 編號從1到n 從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入n,m後,輸出最後猴王的編號。輸入格式 輸入包含兩個整數,第乙個...