Josepfu問題的解決

2021-10-07 02:19:04 字數 2143 閱讀 2734

josephu問題為:設編號為1,2,… n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。

例如: n = 5 , 即有5個人

k = 1, 從第乙個人開始報數

m = 2, 數2下,則出圈的順序為: 2->4->1->5->3

**如下:

public

class

josepfu

}//建立乙個單向環形鍊錶

class

circlesinglelinkedlist

//建立乙個輔助變數,來幫助我們構建單向環形鍊錶

node curnode = null;

//建立鍊錶

for(

int i =

1; i <= nums; i++

)else}}

//遍歷當前環形鍊錶

public

void

show()

//因為first結點不能動,所以建立乙個輔助結點幫助遍歷

node curnode = first;

//如果不為空,則開始遍歷單鏈表

while

(true

) curnode = curnode.

getnext()

;//當前結點向後移}}

/** * 根據使用者的輸入,計算出結點出圈的順序

* @param startno 表示從第幾個結點開始數數

* @param countnum 表示數幾下

* @param nums 表示最初共有多少個結點

*/public

void

countnode

(int startno,

int countnum,

int nums)

//需要乙個輔助結點,指向當前結點的前乙個結點,用於結點的刪除,

//helper初始值應為first結點的前乙個,通過下面的while迴圈得到

node helper = first;

while

(true

) helper = helper.

getnext()

;}//在進行報數之前,讓first和helper向後移動(k-1)次,即(startno - 1) 次,

// 讓first和helper到達指定位置

for(

int i =

0; i < startno -

1; i++

)//開始報數,報數時讓first和helper同時移動m-1次,然後將該結點出圈

while

(true

)for

(int i =

0; i < countnum -

1; i++

)//輸出當前要出圈的first結點的值

system.out.

print

("\n出圈的結點是: "

+ first.

getno()

);//first 結點出圈(刪除當前的first結點)

first = first.

getnext()

; helper.

setnext

(first);}

}}//建立乙個node類,表示乙個結點

class

node

public

intgetno()

public

void

setno

(int no)

public node getnext()

public

void

setnext

(node next)

}

執行結果:

問題的解決

1.1 問題的解決 程式常常是針對某些要解決的問題和任務而編寫的我們來看乙個例子某個書店將每 本售出圖書的書名和出版社輸入到乙個檔案中這些資訊以書售出的時間順序輸入每兩 周店主將手工計算每本書的銷售量以及每個出版社的銷售量報表以出版社名稱的字母順 序排列以使下訂單現在我們希望寫乙個程式來完成這項工作...

昨天解決的問題

今天學習的內容 1 清理類的使用,新建乙個類設定 方框 清除兩者,方在結束div的前面。2 滑動門技術 1,新建 邊界與填充為0 2,新建 li 標籤 背景 不重複,水平位置 右對齊,垂直位置 頂部。3,新建 a 標籤 背景 不重複,水平位置 左對齊,垂直位置 頂部。3 傳ruby動態引數.呵呵,這...

首先解決的問題

確定哪些資訊需要同步 crm的功能界定 產品目錄和相關產品資訊如何更新?更改業務機會狀態 crm產生訂單請求 erp生成訂單的操作 訂單凍結 理解手機簡訊是由哪發出?日程表,erp互操作?財務人員修改某些項?怎麼修改?erp到crm的更新?銷售訂單生成後,客戶資訊,訂單資訊的更新 如何互相服務?服務...