-4

我正在尝试解决约瑟夫斯问题,但我不允许使用其他人的代码片段。考虑到这一点,我的代码中有 27 个错误,但不知道如何修复它。你能不能向我解释为什么它不能编译。我想看看我的逻辑是否有缺陷,但我无法测试它,因为它不会编译。任何其他提示都非常受欢迎!这是我的代码:

import java.util.*;

public class Josephus
{
    public class Link
    {
        public int num;
        public Link next;

        public Link (int d)
        {
            num = d;
            next = null;
        }
    }

    public class Main
    {

        Scanner in = new Scanner(System.in);
        System.out.println("How many players");

        int numPlayers = in.nextInt();
        Link first, last;
        first = last = new Link (1);

        for(int k=2; k<=numPlayers; k++)
        {
            last.next = new Link(k);
            last = last.next;
        }
        last.next = first;

        System.out.println("How many skips");
        int m = in.nextInt();

        for (int g=0; g<numPlayers; g++)
        {
            for (int k=0; k<=m; k++);
            {
                last = last.next;
            }
            last.next;
            last = last.next;
        }
    }
}
4

3 回答 3

2

代替

public class Main

你要

public static void main(String [] args)
于 2013-09-29T20:50:06.560 回答
0

我清理了一些你的代码以便编译,你最好使用两个类

约瑟夫斯.java

import java.util.Scanner;

public class Josephus {

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("How many players");

    int numPlayers = in.nextInt();
    Link first = new Link(1);
    Link last = new Link(1);

    for (int k = 2; k <= numPlayers; k++) {
        last.next = new Link(k);
        last = last.next;
    }
    last.next = first;
    first.next = last;

    System.out.println("How many skips");
    int m = in.nextInt();

    for (int g = 0; g < numPlayers; g++) {
        for (int k = 0; k <= m; k++)
        {
            last = last.next;
        }
        // last.next;
        last = last.next;
    }

    in.close();
}
}

和 Link.java

public class Link {

    public int num;
    public Link next;

    public Link(int d) {
        num = d;
        next = null;
    }
}

这会编译并接受输入,然后引发错误。我还没有解决这个问题,因为我不知道你想要达到什么目的。

变化:

  1. 将 `"class main"` 更改为 `public static void main(){...)` Java 运行时将在调用此方法时查找它。
  2. 提取类`Link`到它自己的文件其他解决方案是可能的,就像其他一些答案说的那样,你可以将它声明为静态或实例化`Josephus`(可能还有其他一些方式)
  3. 注释掉`last.next`这一行,这实际上并没有解决任何问题,它只是消除了编译错误并允许你编译,因为我看不到你在这里尝试做什么我想不出的更好的解决方案。
  4. 不需要编译,但我在 main 方法的末尾添加了行 `in.close();` 以释放分配的资源,如果没有此行,它将引发编译警告。
  5. 添加了`first.next = last;`以避免正在发生的空指针异常。

您现在需要做的就是在嵌套循环中实现 Josephus 逻辑并输出结果(如果需要),所有这些都应该与语言无关。

于 2013-09-29T21:10:09.710 回答
0

您的代码的另一个问题是您有一个非静态内部类Link,并且您尝试在没有包含类的封闭实例的情况下实例化它Josephus

所以要么 make 是静态的

public static class Link

或使用封闭类的实例实例化它

Josephus outer = new Josephus();
first = last = outer.new Link (1);
// ...
last.next = outer.new Link(k);

更好的是,将类移动到一个自己的编译单元中,即一个文件Link.java,直到您了解内部类

和线

last.next;

是不正确的。你想做什么last.next?您必须将其分配给其他变量。我认为你不需要它,只需删除它。

于 2013-09-29T21:10:17.347 回答