有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java以数组的形式从int返回素因子作为输入

我需要编写一个算法,它接受一个int,获取它的素因子,将它们放入数组并返回它们

我的代码如下

public static int[] primfaktorzerlegung(int zahl) {
   int d=1; //this is the length of the array

   int[] result = new int[d]; //array has to be returned

   List<Integer> factors = new ArrayList<Integer>();

   for(int factor = 2; factor <= zahl; factor++) {
       while(zahl % factor == 0) {
           factors.add(factor);
           zahl = zahl / factor;
       }
   }

   for(int i : factors){ //trying to get every number of the arraylist
       int z = i;          
       result[d] = z; //trying to put the numbers of the arraylist into the array result
       d++;           //makes the array dimension one higher
   }
   return result; //returns the array

}

我得到以下错误:

Error: java.lang.ArrayIndexOutOfBoundsException:
Index 1 out of bounds for length 1
at: result[d] = z;

原因可能是什么


共 (1) 个答案

  1. # 1 楼答案

    实际上,通过增加d并不是在增加数组的大小。分配阵列后,其大小将固定

    您可以这样做:

    public static int[] primes(int number) {
        List<Integer> factors = new ArrayList<>();
        for(int factor = 2; factor <= number; factor++) {
            while (number % factor == 0) {
                factors.add(factor);
                number = number / factor;
            }
        }
        return factors.stream().mapToInt(n -> n.intValue()).toArray();
    }
    

    stream()方法将ArrayList公开为Stream,这允许您使用好的方法来操作集合。其中之一是mapToInt,它允许您对流中的每个元素应用函数。应用函数,该函数接受n并返回主体中的任何内容(位于->之后的部分)。特别是,由于您要组合一个装箱的集合Integer,因此必须将它们解装箱到int中(有关装箱的更多信息here)。intValue()方法正是这样做的。最后,通过调用toArray()返回一个int[]。实际上,您的意思是:对列表中的每个项应用intValue(),并返回结果数组

    注意,我把你的主要逻辑保持不变,我没有讨论你如何计算素数因子的正确性