日期:2014-05-20 浏览次数:21088 次
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;