约瑟夫环数组java实现_j使用数组实现约瑟夫环 java

本文介绍如何使用Java编程解决约瑟夫环问题。通过创建一个长度为m+1的数组并初始化,然后利用两个变量i和j来判断和移除每第n个人,直到找到最后剩下的人。代码中包含详细解释和示例。
摘要由CSDN通过智能技术生成

我们首先来看一下约瑟夫环问题:

给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号。

思路:

建立一个长度为m+1的数组,将其的内容初始化为0至m

我们设置变量i与j,i代表数组元素的下表,因为我设置的数组长度为m+1,所以数组下标就为每个人的编号,当i==m的时候,我们将i置为0,让其从头开始便利。

变量j为判断当前元素是否为排列的第n个元素,如果是则将当前下标为i的元素的值置为0,不是的话,i++,j++,每当我们遍历到数值为0的元素时,continue,i++,不进行其他操作。

具体代码如下:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner scanner = new Scanner(System.in);

int m=scanner.nextInt(); //读取m的值

int n = scanner.nextInt(); //读取n的值

int[] a = new int[m+1]; //设置一个长度为m+1的数组

for(int i=0;i<=m;i++) { //初始化数组,将数组的值与其下标一一对应,易懂方便操作

a[i]=i;

}

/*

* 设置变量i与j

* i为判断下标即为元素值

* j为判断n的元素,如果==n即将当前i的元素除去

*/

int i=0,j=1;

boolean flag=false;//设置一个标志变量,在循环中用于break以及continue

while(true) {

i++; //一轮循环进行一次下表后移

flag=false; //将标志变量设置为false

if(a[i]==0) { //如果当前下标中的值为0,即跳过

flag=true;

if(i==m)//判断此时的i是否==m,若果等于m则让其重置为0

i=0;

}

if(flag) //对应上面的函数

continue;

if(j==n) { //如果j==n了

if(PanDuan(a)) { //判断此时数组中是否只有一个非零元素,如果是则当前找到的元素为最后一个元素,否则执行else

System.out.println(i);

flag=true; //因为找到了最后一个元素,则设置标志变量为true

}

else { //只满足j==n,不满足其为最后一个元素,则让当前元素的内容置为0,且让j=0,开始新的计数

a[i]=0;

j=0;

}

}

if(flag) //找到了最后一个元素,跳出循环

break;

if(i==m) //如果i==m,则让i=0

i=0;

j++; //一轮循环,j++

}

}

static boolean PanDuan(int [] a) { //判断给定数组中石否只有一个非零元素

int count =0;

for(int i=0;i

if(a[i]!=0)

count++;

}

if(count==1)

return true;

return false;

}

}

此方法为数组解决,比起用集合麻烦,但是适用于还没有学习集合api的小伙伴们。有更简单的方法可以跟我交流哦~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值