求 JAVA 高手指导下面这个小程序的问题。

求 JAVA 高手指导下面这个小程序的问题。,第1张

报的是空指针异常。你得类名不规范哦,得用大写哈。当然这个不是错误的关键。问题出在你得数组num[]只是声明了,没有实例化,所以空指针异常了。可以改成:int num[]=new num[“数组的长度”];

用java数组实现约瑟夫

package Josephround;

 

public class Joseround {

    int sit;

    int flagjo=0;

    Joseround(){};

    Joseround(int x){

        sit=x;

    }

    void setflag(int x){

        flagjo=x;

    }

 

}

package Josephround;

 

public class Inijose {

    Joseround jo[];

    static int length=0;

    Inijose(){};

    Inijose(int x){

        jo=new Joseround[x];

        for(int i=0;i<x;i++){

            jo[i]=new Joseround(i+1);//创建对象数组

            length++;

        }

    }

    void delete(int n){

        for(int i=n;i<length-1;i++){

            jo[i]=jo[i+1];

            }

        length--;

    }

 

}

package Josephround;

 

import javautilScanner;

 

public class Text {

 

    public static void main(String[] args) {

        int m,n;

        Systemoutprintln("input m");

        Scanner m1=new Scanner(Systemin);

        m=m1nextInt();

        Systemoutprintln("input n");

        Scanner n1=new Scanner(Systemin);

        n=n1nextInt();

        int temp=0;

        int x=0;

        Inijose joseph=new Inijose(n);

        while(josephlength!=0){

            for(int i=1;i<=m;i++){

                josephjo[x]setflag(i);

                if(josephjo[x]flagjo==m){

                    Systemoutprintln(josephjo[x]sit);

                    josephdelete(x);

                    x--;

                }

                if(x<josephlength-1) x++;

                else x=0;

            }

        }

         

    }

 

}

这个是用集合类写的,建议你多用集合类少用数组,从整个Java的api上来看,对集合类的支持要好于数组

Josephus(1, 9, 5) 这个构造方法的意思 从第1个人开始报数,一共9个人,数到5的人出列

用了一个Iterator,不用也可以

List选用了LinkedLisk,用ArrayList或Vector也可以

没有仔细想,有问题再交流

import javautilIterator;

import javautilLinkedList;

public class Main {

public static void main(String[] args) {

Josephus test = new Josephus(1, 9, 5);

for (Integer i : test) {

Systemoutprintln(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) {

thisfirst = first;

thiscapacity = capacity;

thiskey = key;

thisstack = new LinkedList<Integer>();

for (int i = 1; i <= thiscapacity; i++) {

thisstackadd(i);

}

for (int i = 0; i < thisfirst - 1; i++) {

thisstackadd(thisstackremove());

}

}

public Iterator iterator() {

return new Itr();

}

class Itr implements Iterator<Integer> {

public boolean hasNext() {

return !stackisEmpty();

}

public Integer next() {

for (int i = 0; i < key - 1; i++) {

stackadd(stackremove());

}

return stackremove();

}

public void remove() {

throw new UnsupportedOperationException("Not supported yet");

}

}

}

while (true) {

for (j = 0; j < m;) //在圈中数m个人

{

i = (i + 1) % n; //判断下一个人是否已离开,因为是环形的遇到最后一个+1时i会变成0

if (a[i] >0) j++; //a[i] >0表示第i个人还没有离开

}

//m个人数好了,这时候下一个就是要离开的

if(k==n) break; //k等于n表示只剩下一个人了,这个人就是最后的获胜者,break跳出循环

Systemoutprintln("No" + a[i] + " is out!");

a[i] = -1; //表示该人离开

k++;

}

public class Byuesefu {

    final static int k = 1;//从k开始

    final static int n = 8;//总共n个人

    final static int m = 3;//数到m时出列

    public static void main(String[] args) {

        int count=n;

        int i;

        int tt=0;

        boolean[] b=new boolean[n];

        for(int j=0;j<blength;j++)b[j]=true;

        for(i=k;count>1;i++){

            if (i==n) i=0;

            if (b[i]==true)

            tt++;

                if (tt==m) {

                tt=0;

                b[i]=false;

                Systemoutprintln(i+"被踢出");

                count--;

                }

            }

        for(i=0;i<blength;i++){

            if(b[i]==true){

                Systemoutprintln("-----");

                Systemoutprintln("还剩"+i+"号");

            }

        }

    }

}

package ysfh;

/

约瑟夫环的问题

有17个人(编号从1到16),按编号依次排列成一个圆环(编号16的接着编号为1 的人),从编号为1 的人开始报数,数到3的人退出圆环,如此循环,最后留下的那个人的编号是什么?

1,2,3,4,5,6,7,8,,9,10,11,12,13,14,15,16

要求:请用面向对象的思想来处理这个问题并在下面写出具体的代码(可以选择你熟悉的语言,如java/C++/C#等)

@author Administrator

/

public class Ysfh {

public static void main(String[] args) {

m(3,16);

}

public static void m(int m,int n){

int c = 1;

int[] ns = ntoarray(n);

while(isone(ns) == false){//如果数组中有一个以上的数不为0

for (int i = 0; i < nslength; i++) {

if(ns[i] != 0 ){//等于0的都退出了 所以从所有不等于0的开始

if(c == m){//是第三个数 给他赋值0 并让计数器c从1 开始

ns[i] = 0 ;

c = 1;

}else{//否则继续计数器下一个

c++;

}

}

}

}

//循环输出最后留下的数字

for (int i = 0; i < nslength; i++) {

if(ns[i] != 0){//除0以外的数字 0代表删除

Systemoutprintln(ns[i]);

}

}

}

/

将 n 转换为数字 n=3 {1,2,3}

@param n

@return

/

public static int[] ntoarray(int n){

int[] ns = new int[n];

for (int i = 0; i < nslength; i++) {

ns[i] = i + 1;

}

return ns;

}

/

判断数组里是否只有一个数不为0

@param ns

@return

/

public static boolean isone(int[] ns){

boolean isone = false;

for (int i = 0; i < nslength; i++) {

if(isone == false && ns[i] != 0){

isone = true;

}else if(isone == true && ns[i] != 0){

return false;

}

}

return isone;

}

}

编程题目不要发帖子,因为很少有人来写。

不过你可以把你写的程序贴出来,让大家修改,大家还是乐意的。

-------我只能用搜索找了一下:-----------

解决问题的核心步骤:

1建立一个具有n个链结点,无头结点的循环链表

2确定第1个报数人的位置

3不断地从链表中删除链结点,直到链表为空

void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数

{

/ p为当前结点 r为辅助结点,指向p的前驱结点 list为头节点/

LinkList p,r,list;

/建立循环链表/

for(int i=0,i

以上就是关于求 JAVA 高手指导下面这个小程序的问题。全部的内容,包括:求 JAVA 高手指导下面这个小程序的问题。、怎么用java数组实现约瑟夫环、JAVA中怎么用List实现约瑟夫问题,我只会用数组求、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9523882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存