題目1:Josephus環的問題及算法
【實驗內容】
編程實現如下功能:
題意說明:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第start個犯人開始數起,每數到第distance的犯人,就出列處決;再從下一個犯人開始計數,數到的犯人被處決……以此類推不斷循環,直到剩下最后一個犯人予以赦免。此為Josephus環問題。
要求:采用線性表(可以為順序表或鏈表)標記n個人,這n個人分別標為A、B、C……,請用Java語言編寫程序,按順序輸出出列人的標記。
【實驗要求】
輸入格式:
輸入為3個正整數,分別表示n、start、distance,均不超過1000
輸出格式:
輸出為一行整數,為出列人的編號。每個整數后一個空格。
(1)解決思路
(2)代碼截圖
(3)源代碼
import java.util.*;
public class self_test02 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("輸入均不超過1000");System.out.print("出列數:");int num = sc.nextInt();//出列System.out.print("開始數:");int start = sc.nextInt();//開始System.out.print("結束數:");int end = sc.nextInt();//結束ArrayList<String> list = new ArrayList<String>();for (int i = start; i <= end; i++) {list.add(String.valueOf(i));}// 第幾個人,當num=reset就重置為0int reset = 0;int j = 0;// list.size() 鏈表長度 數組長度是 lengthString ans = "";while (!list.isEmpty()) {Iterator it = list.iterator();while (it.hasNext()) {reset++;if (num == reset) {ans += it.next();ans += " ";reset = 0;it.remove();} else {it.next();}}}String ans1 = ans.substring(0, ans.length() - 1);System.out.println(ans1);}}
}
(4)實驗結果
題目2:銀行業務隊列簡單模擬
?【實驗內容】?
設某銀行有A、B兩個業務窗口,且處理業務的速度不一樣,其中A窗口處理速度是B窗口的2倍 —— 即當A窗口每處理完2個顧客時,B窗口處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先后到達的時間間隔,并且當不同窗口同時處理完2個顧客時,A窗口顧客優先輸出。
【實驗要求】
輸入格式:
輸入為一行正整數,其中第1個數字N(≤1000)為顧客總數,后面跟著N位顧客的編號。編號為奇數的顧客需要到A窗口辦理業務,為偶數的顧客則去B窗口。數字間以空格分隔。
輸出格式:
按業務處理完成的順序輸出顧客的編號。數字間以空格分隔,但最后一個編號后不能有多余的空格。
輸入樣例:
8 2 1 3 9 4 11 13 15
輸出樣例:
1 3 2 9 11 4 13 15?
?(1)解題思路
?(2)代碼截圖
?(3)源代碼
import java.util.*;
public class self_test {public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner = new Scanner(System.in);int num = scanner.nextInt();int[] arr = new int[num];
// 創建一個數組,用于存放所有輸入值(除第一位)for (int i = 0; i < num; i++) {arr[i] = scanner.nextInt();}
// 創建a,b隊列ArrayDeque arr_a = new ArrayDeque();ArrayDeque arr_b = new ArrayDeque();
// 編號為奇數的顧客需要到A窗口辦理業務,為偶數的顧客則去B窗口for (int i = 0; i < arr.length; i++) {if (arr[i] % 2 == 0) {arr_b.add(arr[i]) ;} else {arr_a.add(arr[i]) ;}} String str = new String();while(!arr_a.isEmpty() && !arr_b.isEmpty()) {
// A的元素個數為偶數,則從A中取出兩個元素和一個B中的元素if (arr_a.size() % 2 ==0) {str += arr_a.removeFirst()+" ";str += arr_a.removeFirst()+" ";str += arr_b.removeFirst()+" ";}else {
// A的元素個數為奇數,則從A中取出一個元素和一個B中的元素str += arr_a.removeFirst()+" ";str += arr_b.removeFirst()+" ";}}
// A為空時,把B的元素賦值給Aif (arr_a.isEmpty()) {arr_a = arr_b;}
// 將A中的所有元素取出,依次將它們拼接成一個字符串if (!arr_a.isEmpty()) {while(!arr_a.isEmpty()) {str+=arr_a.removeFirst()+" ";}}
// 去掉最后一個空格System.out.println(str);}
}