数字的前n个除数

时间:2018-09-20 21:25:31

标签: java arrays for-loop

这是一个非常简单的问题,但我遇到了麻烦。我想创建一个显示给定数字n的前x个除数的方法。我选择创建一个存储x的所有倍数的数组,然后输入要查看的数量。

例如,如果x = 20,那么我将拥有[1, 2, 4, 5, 10, 20],而前4个将是124和{{1} }。

这是我写的:

5

我认为有更好的方法可以做到这一点,但我想在解决方案中提供一些技巧。

1 个答案:

答案 0 :(得分:1)

错误是您将整个搜索循环所需的次数-每个结果一次。这非常贵。请注意,内部循环是代码,只需要循环一次即可。存储每个匹配的数字后,您可以增加数组的索引来保存值。

  1. 您需要循环使用最多一半的数字。
  2. 您只需要循环一次。

您在这里:

public static String multOf(int x, int n) {
    int[] result = new int[n];                // To store the result
    int count = 0;                            // A counter to not exceed the 'n'
    for (int i=1; i<Math.round(x/2); i++) {   // The iteration starting from the zero
        if (x % i == 0) {                     // Is 'x' divisible by 'i'?
            result[count] = i;                // ... if so, save to the array
            count++;                          // ... and increment the index
        } if (count == n) {                   // If the limit has been reached
            break;                            // ... leave the iteration
        }
    }
    return Arrays.toString(result);           // Return the result
}

但是,在诸如multOf(20,9)之类的调用中,如果除数的数量小于要求的数量,则输出看起来像[1, 2, 4, 5, 0, 0, 0, 0, 0]

因此,我建议使用List<Integer>

public static String multOf(int x, int n) {
    List<Integer> list = new ArrayList<>();
    int count = 0;
    for (int i=1; i<Math.floor(x/2); i++) {
        if (x % i == 0) {
            list.add(i);
        } if (list.size() == n) {
            break;
        }
    }
    return list.toString();
}

现在,multOf(20,9)调用将产生[1, 2, 4, 5]

一个真正痴迷于Java 8 Stream API的爱好者会做(但是,要慢一些):

public static String multOf(int x, int n) {
    return IntStream.rangeClosed(1, x/2)
                    .boxed()
                    .filter(i -> x % i == 0)
                    .limit(n)
                    .collect(Collectors.toList())
                    .toString();
}