报的是空指针异常。你得类名不规范哦,得用大写哈。当然这个不是错误的关键。问题出在你得数组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实现约瑟夫问题,我只会用数组求、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)