求 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)
真心求解。谢谢。 展开
我的程序:
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)
真心求解。谢谢。 展开
展开全部
num[] 这个数组只是声明~~,没初始化~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的数组num在用之前没有指定数组长度,就没有num[i],所以会报空指针异常
解决方法:声明数组的时候进行静态初始化或者动态初始化(当前问题建议使用动态初始化),个人感觉在java开发中,数组的使用率不是很高,建议使用集合,更灵活!
解决方法:声明数组的时候进行静态初始化或者动态初始化(当前问题建议使用动态初始化),个人感觉在java开发中,数组的使用率不是很高,建议使用集合,更灵活!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
num[]没有初始化,
而num[i] = 0; 又在引用,
原本num没有初始化就是空的,而你又要循环使用里面的元素,那...
就像明明这间教师里面是空的,你还要点到,那有谁?连顶替的都没?
纯属个人愚见。
而num[i] = 0; 又在引用,
原本num没有初始化就是空的,而你又要循环使用里面的元素,那...
就像明明这间教师里面是空的,你还要点到,那有谁?连顶替的都没?
纯属个人愚见。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int num[ ]初始化时未给定大小.即num=null
在void slv(int n,int m){后面加一句
num = new int[n+1];
在void slv(int n,int m){后面加一句
num = new int[n+1];
追问
我 想知道num = new int[n+1]; 这句话 是什么 意思呢?不好意思我初学JAVA 。求细心解答,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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变量。
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变量。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询