public class circle //约瑟夫环
{
static class player//参与者类
{
String name;//参与者姓名
int list,count;//参与者号码和控制出局变量
player()
{
name="li";
list=l;
count=0;
}
}
public static void main(String[] args)
{
player pr[]=new player[6];
for(int i=0;i<6;i++) //初始化
{
pr[i].name="name"+i;
pr[i].list=i;
pr[i].count=0;//用来判断该对象是否出局
}
int m=2;//第二个出局
int lengh=6;//一共6个人
int k=1;
int i=0;
while(lengh==m-1)
{
if(k==m && pr[i].count==1)
{
i=(i+1)%6;
}
else if(k==m&&pr[i].count==0)
{
pr[i].count=1;
System.out.println(pr[i].name);
k++;
i=(i+1)%6;
}
else
{
k++;
i=(i+1)%6;
}
}
}
}
------解决方案--------------------------------------------------------
- Java code
class player// 参与者类{ String name;// 参与者姓名 int list, count;// 参与者号码和控制出局变量 player() { name = "li"; list = 1; count = 0; } @Override public String toString() { return "Player:" + name + "," + list + "," + count; }}public class Circle // 约瑟夫环{ public static void main(String[] args) { player pr[] = { new player(), new player(), new player(), new player(), new player(), new player() };// 需要初始化数组中的6个player for (int i = 0; i < 6; i++) // 初始化 { pr[i].name = "name" + (i+1); pr[i].list = i+1; pr[i].count = 0;// 用来判断该对象是否出局 // System.out.println(pr[i]); } int i, j, n, m; m = 2;// 第二个出局 n = 6;// 一共6个人 if (n <= 0 || m <= 0) // 处理参数值不正确的情况 { System.out.println("Paramter must bigger than zero!"); return; } int k = 1; // 标识处理第k个离开的人 i = -1; // 数组下标,下一个为0,即第一个人 while (true) // k等于n表示只剩下一个人了 { for (j = 0; j < m;) // 在圈中数m个人 { i = (i + 1) % n; if (pr[i].count == 0) j++; // a[i] >0表示第i个人还没有离开 } if (k == n) break; pr[i].count = 1; // 表示该人离开 System.out.println("No." + pr[i] + " is out!"); k++; } System.out.println("No." + pr[i] + " is the winner!"); System.out.println("------end------"); }}
------解决方案--------------------------------------------------------
第一个问题pr[i].name=p[i].name+i; name为Player的属性应该对象名打点调用。
第二个问题数组没有初始化在for循环中应该将6个人的信息初始化即加上pr[i]=new Player();
第三个问题当有人数到2时此人出局所以所有人的总数length应该减一,即满足条件:if(k==m&&pr[i].count==0)时应该length--
第四个问题当报数由1数到2应该再从1数到2所以每当k++时应该判断k的值是否为3如果为3则k应赋值为1,即在所有k++后应加入if(k==3)if(k==3){k=1;}
修改后的代码为:
public class Player
{
String name;//参与者姓名
int list,count;//参与者号码与控制出局变量
Player()
{
name="li";
list=1;
count=0;
}
public static void main(String args [])
{
Player [] pr=new Player[6];
for(int i=0;i<6;i++)
{
pr[i]=new Player();
pr[i].name=pr[i].name+i;
pr[i].list=i;
pr[i].count=0;//用来判断该对象是否出局
}
int m=2;//第二个出局
int length=6;//一共6个人
int k=1;
int i=0;
while(length!=m-1)
{
if(k==m && pr[i].count==1)
{
i=(i+1) % 6;
}
else if(k==m&&pr[i].count==0)
{
pr[i].count=1;