关于利用java数组来求约瑟夫难题。。。。。

publicclassnysf{intarr[];intlength;intx;inta;//用来遍历的量intcount;inth=0;//用来计算不为0的元素publ... public class nysf {
int arr[];
int length;
int x;
int a;//用来遍历的量
int count;
int h=0;//用来计算不为0的元素
public static void main(String[] args) {
new nysf().sort(8, 2);
}

void sort(int length, int x) {
this.length = length;
this.x = x;
arr = new int[length + 1];
arr[0] = 1;
for (int i = 1; i < length + 1; i++) {
arr[i] = i;
}
a=x+1;//从1开始
while (true) {
System.out.println("第" + arr[a] + "离开");
arr[a] = 0;
count++;
if (count == length ) {
break;
}
qingling();//清零的方法
a = a + h;
this.over();
}

}
void qingling() {
h = 0;
int i=a;
while (h < x + 1) {//为什么这一步出现死循环
if(i>length){
i=0;
}
if (arr[i] != 0) {
h++;
i++;
}
if (h == x + 1) {
a=a+h;
}

}

}
void over() {
if (a >= length) {
a = a % length;
if (a == 0) {
a = length;
}
}
}

}
展开
 我来答
手机用户33099
2011-09-16 · TA获得超过486个赞
知道小有建树答主
回答量:705
采纳率:0%
帮助的人:415万
展开全部
这个是用集合类写的,建议你多用集合类少用数组,从整个Java的api上来看,对集合类的支持要好于数组
Josephus(1, 9, 5) 这个构造方法的意思 从第1个人开始报数,一共9个人,数到5的人出列
用了一个Iterator,不用也可以
List选用了LinkedLisk,用ArrayList或Vector也可以
没有仔细想,有问题再交流

import java.util.Iterator;
import java.util.LinkedList;

public class Main {

public static void main(String[] args) {
Josephus test = new Josephus(1, 9, 5);
for (Integer i : test) {
System.out.println(i);
}
}
}

class Josephus implements Iterable<Integer> {

private LinkedList<Integer> stack;
private int first; //从第几个人开始
private int key; //数几个
private int capacity; //一共几个人

public Josephus(int first, int capacity, int key) {
this.first = first;
this.capacity = capacity;
this.key = key;
this.stack = new LinkedList<Integer>();
for (int i = 1; i <= this.capacity; i++) {
this.stack.add(i);
}
for (int i = 0; i < this.first - 1; i++) {
this.stack.add(this.stack.remove());
}
}

public Iterator iterator() {
return new Itr();
}

class Itr implements Iterator<Integer> {

public boolean hasNext() {
return !stack.isEmpty();
}

public Integer next() {
for (int i = 0; i < key - 1; i++) {
stack.add(stack.remove());
}
return stack.remove();
}

public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shenaodong
2011-09-16 · TA获得超过960个赞
知道小有建树答主
回答量:868
采纳率:0%
帮助的人:798万
展开全部
while (h < x + 1) {//为什么这一步出现死循环
因为你的arr[i]一直为零《==System.out.println("第" + arr[a] + "离开");
arr[a] = 0;
导致h不能自增,即h一直为0,所以是死循环。if (arr[i] != 0) {
h++;
i++;
}
这边应该有个else来处理为零的情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
储利玉2i
2011-09-16 · TA获得超过1157个赞
知道小有建树答主
回答量:954
采纳率:0%
帮助的人:486万
展开全部
void qingling() {
h = 0;
int i = a;
while (h < x + 1) {// 为什么这一步出现死循环
// TODO 添加打印语句测试,这里打印出的是"h=0; x=2",这两个值一直没变,h<x+1的条件一直为true,所以死循环
System.out.println("h=" + h + "\tx=" + x);
if (i > length) {// TODO 断点调试if没进
i = 0;
}
if (arr[i] != 0) {// TODO 断点调试if没进
h++;
i++;
}
if (h == x + 1) {// TODO 断点调试if没进
a = a + h;
}

}

}

提示: 每循环一次要清楚h与x值的变化,这是出现死循环的关键,你的三个if语句全没有进入等于没写,这样就相关于写了一个while(true){}程序了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名_热心网友
2011-09-30 · TA获得超过719个赞
知道大有可为答主
回答量:3827
采纳率:0%
帮助的人:8419万
展开全部
System是一个类,in是System这个类里的一个属性,这个属性的类型是inputStream类型的,也就是输入流,System类位于java.lang包里,你在java API里找到这个类,你就会一目了然了, 比如:
public class Test{
public static int num ;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式