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

题目要求解决约瑟夫环问题。我的程序:publicclassysfh{publicstaticclassNumber{intnum[];intgetnext(intp){w... 题目要求解决约瑟夫环问题。
我的程序:
public class ysfh {
public static class Number {
int num[];
int getnext(int p)
{ while(num[(p+1)%10] == 1)
p++;
return (p+1)%10;
}
void slv(int n,int m){
int i , p ,tm,drop=0;
for(i = 0; i <= n; i++)
num[i] = 0;
p = 1;
for (i = 0 ; i < n; i++)
{
tm=m;
while(tm>0)
{ drop = p;
p = getnext(drop);
tm--;
}
num[drop] = 1;
if (drop == 0)
drop = n;
if ( i == n)
System.out.println(drop);
else System.out.println(drop+" ");

}
}
}
public static void main(String args[]){

Number number = new Number();
number.slv(10,3);
}

}
编译没有语法错误,但是最后运行出错。出错提示为:
Exception in thread "main" java.lang.NullPointerException
at pack_11.ysfh$Number.slv(ysfh.java:15)
at pack_11.ysfh.main(ysfh.java:38)
真心求解。谢谢。
展开
 我来答
bufferW
2011-09-29
知道答主
回答量:12
采纳率:0%
帮助的人:11.1万
展开全部
报的是空指针异常。你得类名不规范哦,得用大写哈。当然这个不是错误的关键。问题出在你得数组num[]只是声明了,没有实例化,所以空指针异常了。可以改成:int num[]=new num[“数组的长度”];
gaomingnihuai
2011-09-29
知道答主
回答量:13
采纳率:0%
帮助的人:3.7万
展开全部
num[] 这个数组只是声明~~,没初始化~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jaiye747
2011-09-29 · 超过21用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:49.4万
展开全部
你的数组num在用之前没有指定数组长度,就没有num[i],所以会报空指针异常

解决方法:声明数组的时候进行静态初始化或者动态初始化(当前问题建议使用动态初始化),个人感觉在java开发中,数组的使用率不是很高,建议使用集合,更灵活!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
独孤学武
2011-09-29 · TA获得超过413个赞
知道小有建树答主
回答量:544
采纳率:0%
帮助的人:136万
展开全部
num[]没有初始化,
而num[i] = 0; 又在引用,
原本num没有初始化就是空的,而你又要循环使用里面的元素,那...
就像明明这间教师里面是空的,你还要点到,那有谁?连顶替的都没?
纯属个人愚见。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
weipeng1986113
2011-09-29
知道答主
回答量:5
采纳率:0%
帮助的人:6.3万
展开全部
int num[ ]初始化时未给定大小.即num=null
在void slv(int n,int m){后面加一句
num = new int[n+1];
追问
我 想知道num = new int[n+1]; 这句话 是什么 意思呢?不好意思我初学JAVA 。求细心解答,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ly3060703112
2011-10-09
知道答主
回答量:11
采纳率:0%
帮助的人:21.1万
展开全部
1.num数组在使用前没有进行初始化
2.在运算逻辑上有问题
给以你个例子:
import java.util.ArrayList;
import java.util.List;

public class Test2 {
//用来存储人员的容器
List<Integer> members = new ArrayList<Integer>();

//开始报数的人的编号,初始化默认为1号
int next = 1;

public Test2(int total){
//给所有人员初始化编号
for (int i = 1; i <= total; i++) {
members.add(i);
}
}
/**
* 返回出列人的编号
* @param members 参加人员
* @param step 步长(数到几出列)
*/
public int getNext(List<Integer> members, int step){

//报数人的位置初始值为0
int index = 0;

//查找开始报数人的位置
while(step > 0){
if (members.get(index) == next) {
break;
}else {
index++;
}
}

//开始报数,因为如果每次数的3出列,实际上只前进了2步,故这里的判断条件为 step -1
for (int i = 0; i < step-1; i++) {
index++;

//检测下标是否越界,如果越界将下标置为0
if (index == members.size()) {
index = 0;
}
}

//出列人的编号
int result = members.get(index);

//下一次开始报数人的编号
int nextIndex = index + 1;

//检测下标是否越界,如果越界将下标置为0
if (nextIndex == members.size()) {
nextIndex = 0;
}

//更新下次开始报数人的编号
next = members.get(nextIndex);

//将出列人从队中移除
members.remove(index);

return result;
}

public static void main(String[] args) {

//参加约瑟夫环的总人数
int total = 10;

//每次数到几的人出列
int step = 3;

Test2 test2 = new Test2(total);

while(!test2.members.isEmpty()){
System.out.print(" " + test2.getNext(test2.members, step));
}
}

}

3.num = new int[n+1]; 的意思是:向系统申请一块长度为n+1的int型数组,并将其首地址(即该内存的引用)赋值给num变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(9)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式