java约瑟夫环问题,结果总是不对,求大神相助

17个人围成一个圈子,人的编号从0开始到16,从1报数,凡是报到3或3的倍数的人都离开圈子,然后继续,问最后一个人的编号是多少我的代码:publicclassJoseph... 17个人围成一个圈子,人的编号从0开始到16,从1报数,凡是报到3或3的倍数的人都离开圈子,然后继续,问最后一个人的编号是多少

我的代码:
public class JosephRing{
public static void main(String []args){
int []a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int i,j,k;
for(i=0,j=0,k=0;k<=16;i++){ //i是当前人的编号,j用于计算谁数到了3的倍数,k为出局人数
i=i%17; //使i始终保持在0-16之间
if(a[i]!=-1){
j++;
}
if(j%3==0){
a[i]=-1; //被赋值为-1即出局
k++;
}
}
System.out.println(i);
}
}
结果本应该是10,但是我的输出16,看了好长时间都不知道哪错了
求大神指点。。。
展开
 我来答
gdx2013
推荐于2017-09-13 · 超过58用户采纳过TA的回答
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:134万
展开全部

你的思路没错,但需要改变一点,就直观了,代码如下

public class JosephRing {
 public static void main(String[] args) {
  int []a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
  int i,j,k;
  for(i=0,j=0,k=0;k<=16;i++){
   i=i%17;      
   if(a[i]!=-1){
    j++;
    }   
   if(j%3==0 && a[i]!=-1){//改了这里
    System.out.println("第"+(k+1)+"个离开的人编号为:"+a[i]);
    a[i]=-1;
    k++;
    }  
   }  
  System.out.println(i);//这个i其实是做了i++之后的
  }
 }

 

nanwanglsky
2014-07-29 · 超过23用户采纳过TA的回答
知道答主
回答量:60
采纳率:0%
帮助的人:47.1万
展开全部
把k<=16改为k<16
应该到16次就找到了
多算了1次
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式