关于利用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;
}
}
}
} 展开
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;
}
}
}
} 展开
4个回答
展开全部
这个是用集合类写的,建议你多用集合类少用数组,从整个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.");
}
}
}
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.");
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while (h < x + 1) {//为什么这一步出现死循环
因为你的arr[i]一直为零《==System.out.println("第" + arr[a] + "离开");
arr[a] = 0;
导致h不能自增,即h一直为0,所以是死循环。if (arr[i] != 0) {
h++;
i++;
}
这边应该有个else来处理为零的情况。
因为你的arr[i]一直为零《==System.out.println("第" + arr[a] + "离开");
arr[a] = 0;
导致h不能自增,即h一直为0,所以是死循环。if (arr[i] != 0) {
h++;
i++;
}
这边应该有个else来处理为零的情况。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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){}程序了。
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){}程序了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
System是一个类,in是System这个类里的一个属性,这个属性的类型是inputStream类型的,也就是输入流,System类位于java.lang包里,你在java API里找到这个类,你就会一目了然了, 比如:
public class Test{
public static int num ;
}
public class Test{
public static int num ;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询