这是我的第一篇文章,所以如果我写了些愚蠢的话,会让我sto脚。

我刚刚开始IT课,今天在“while”循环课上,我的老师为我们提供了以下作业:



到目前为止,我想出了一个可以运行的代码,但是结果有点错误:

import java.util.Arrays;
import javax.swing.JOptionPane;

public class Divisors {
    public static void main(String[] args) {
        String n = JOptionPane.showInputDialog(null, "Enter a natural number");
        Integer i = Integer.parseInt(n);

        int d = i - 1;
        int x = 2;
        int[] dvr = new int[i]; // [i] because bigger numbers need more iterations

        while (x >= 2 && x <= d) {
            double y = i % x;

            if (y == 0) {
                dvr[x] = x;
                x = x + 1;
            } else {
                x = x + 1;
            }
        }

        JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(dvr));
    }
}

问题在于,循环用很多零填充了数组,并且教师结果的屏幕截图显示了一个仅列出除数的窗口。

我试图用ArrayList做到这一点,但这对我来说是个黑魔法,而且我的导师还没有教我们如何使用代码中所用内容之外的任何东西。

任何帮助表示高度赞赏。

最佳答案

您遇到的主要问题是您要打印的数值数量未知,但是您使用数组存储它们,并且数组的大小固定。由于您具有int数组,因此将使用默认值零完全填充它。

理想情况下,您只需要打印数组的第一串非零值,但是要存储散布在整个数组中的除数。
dvr[x] = x;将每个值存储在该值的索引处,实际上,您应该将每个新值存储在数组中的下一个空位中。

创建一个单独的索引变量,并使用它来存储每个值:

    int index = 0;
    while (x >= 2 && x <= d) {
    ...
        if (y == 0) {
            dvr[index++] = x;
    ...

然后,在完成主循环后,可以创建一个仅包含除数而不包含零的新“显示数组”。此时,index会告诉您确切的大小:
    int[] display = Arrays.copyOf(dvr, index);
    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(display));

关于java - 数字除数的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33088097/

10-13 05:24