天天看點

約瑟夫環問題:有n個人圍成一圈,順序編号。從第1個人開始報數(從1-3報數),凡報到3的人退出圈子,問最後留下的是原來第幾号的那位?

有n個人圍成一圈,順序編号。從第1個人開始報數(從1-3報數),凡報到3的人退出圈子,問最後留下的是原來第幾号的那位?

int  n = 10;//n的取值
int num = n;//記錄剩餘數個數
int arr[] = new int[n];//标記剩餘數的位置 0 代表存活,初始全部存活   1 代表删除
int flag = 0; //标記報名,到三降0
int del = 3;//擴充字段,将報三的删除,可以任意定義
while(num != 1){//當剩餘數量為1時,停止循環
    for(int i = 0;i<n ; i++){//
        if(arr[i] == 0){ //判斷目前元素是否存活
            flag ++; //元素存活,報名數加一;每次for循環後,報名數會接着下次循環繼續增長,約瑟夫環循環
        }
        if(flag == del){//當報名數為三時
            arr[i] = 1;//将目前元素标記為1,删除操作
            flag = 0;//報名數降為0
            num --;//總人數減去1
        }
    }
}
for(int i = 0;i<arr.length ; i++) {
    if(arr[i] == 0) {
        System.out.println(i+1);//數組下标從0開始
    }
}
有n個人圍成一圈,順序編号。從第1個人開始報數(從1-m報數),凡報到m的人退出圈子,問最後留下的是原來第幾号的那位?

int  n = 10;
int num = n;
int arr[] = new int[n];
int flag = 0;
int del =m;//擴充字段,将報三的删除,定義為m
while(num != 1){
    for(int i = 0;i<n ; i++){
        if(arr[i] == 0){
            flag ++;
        }
        if(flag == del){
            arr[i] = 1;
            flag = 0;
            num --;
        }
    }
}
for(int i = 0;i<arr.length ; i++) {
    if(arr[i] == 0) {
        System.out.println(i+1);
    }
}
           

https://blog.csdn.net/fz13768884254/article/details/82178759