简体   繁体   English

使用嵌套数组来显示和计算素数因子或其他操作的数量

[英]Using nested arrays to show and count number of prime factors or other operations

I have an algorithm which counts prime factors of a given range of numbers. 我有一个算法,它计算给定数字范围的素因子。 For example between 10 and 20. 例如10到20之间。

Result is: number 10: factors are: 2, 5. number 11: factors are: 11. number 12: factors are: 2, 6. etc. ... . 结果是:数字10:因素是:2,5。数字11:因素是:11。数字12:因素是:2,6等。...

But I would like to check which numbers have only 2 or 3 or 4 or more prime factors. 我想检查哪些数字只有2或3个或4个或更多的素因子。

Those numbers I store in an array. 我存储在数组中的那些数字。 And my idea is to assign those individual prime factors to a given number. 我的想法是将这些个别素数因子分配给给定的数字。 So I should have an arraylist probably, which is changing dynamically (as name as size also). 所以我应该有一个arraylist,它正在动态变化(也就像大小一样)。

For example: 例如:

ArrayOfNumbers[0] = 10; ArrayOfNumbers [0] = 10;
ArrayOfPrimeFactorsOf 10 Number[0] = 2; ArrayOfPrimeFactorsOf 10 Number [0] = 2; ArrayOfPrimeFactorsOf 10 Number[1] = 5; ArrayOfPrimeFactorsOf 10 Number [1] = 5;

ArrayOfNumbers[1] = 11; ArrayOfNumbers [1] = 11; ArrayOfPrimeFactorsOf 11 Number[0] = 11; ArrayOfPrimeFactorsOf 11 Number [0] = 11;

And I could compare which number has for example 2 or 3 prime factors => by getting size of array of prime factors (ArrayOfPrimeFactorsOf..Number) which belongs to a number of array (ArrayOfNumbers) and display this number and its prime factors also. 我可以通过获取属于多个数组(ArrayOfNumbers)的素因子数组(ArrayOfPrimeFactorsOf..Number)的大小来比较哪个数字具有例如2或3个素数因子=>并且还显示该数字及其素因子。

My question is: How could I make this as nested array (ArrayOfPrimeFactorsOf..Number) and assign this to ArrayOfNumbers[..]? 我的问题是:我怎么能把它作为嵌套数组(ArrayOfPrimeFactorsOf..Number)并将其分配给ArrayOfNumbers [..]?

Maybe do you have any other idea how to resolve this challenge? 也许您对如何解决这一挑战有任何其他想法?

Below is a program: 以下是一个程序:

 public static void countPrimeFactors() {

    int min = 10; // min number in array
    int max = 20; // max number in array

    Integer[] arrayOfNumbers = new Integer[100000];

    for (int a = 0; a < arrayOfNumbers.length; a++) {

        for (int k = min; k <= max; k++) {

            arrayOfNumbers[a] = k;
            System.out.print(arrayOfNumbers[a] + ": ");

            if (arrayOfNumbers[a] % 2 == 0) {

                System.out.print(2 + " ");
                arrayOfNumbers[a] /= 2;

            }
        // n must be odd at this point. So we can
        // skip one element (i = i +2)
            // i is a current factor
            // array[a] is a current number

        for (int i = 3; i <= Math.sqrt(arrayOfNumbers[a]); i += 2) {
            // While i divides n, print i and divide n
            if (arrayOfNumbers[a] % i == 0) {

                System.out.print(i + " ");
                arrayOfNumbers[a] /= i;
            }

        }

        // This condition is to handle the case when
        // n is a prime number greater than 2
        if (arrayOfNumbers[a] > 2)

            System.out.print(arrayOfNumbers[a] + " , ");

        }  
        break;
    }

    System.out.print("Length of array[a]: " + arrayOfNumbers.length);
}

I think that using maps would be best solution for this, TreeMap especially, key should be number for which you are finding factors, and value should be some other collection containing all factros. 我认为使用地图将是最好的解决方案,特别是TreeMap,key应该是您要查找因子的数字,而值应该是包含所有factros的其他集合。 Example: 例:

    Map<Integer, Set<Integer>> numbers = new TreeMap<>();
            int min = 10;
    int max = 20;
    Map<Integer, Set<Integer>> numbers = new TreeMap<>();
    for (int i = min; i <= max; i++) {
        Set<Integer> factors = new TreeSet<>();
        for (int j = 2; j <= i/2; j++) {
            if (i % j == 0) {
                factors.add(j);
            }
        }
        //factors.add(i);
        numbers.put(i, factors);

    }
    System.out.println(numbers.get(11).size());
    System.out.println(numbers.values());

This is general idea, you could easily get then number of factors for each number by numbers.get(someNumber).size(); 这是一般的想法,您可以通过numbers.get(someNumber).size();轻松获得每个数字的因子数量numbers.get(someNumber).size();

If you uncomment factors.add(i); 如果取消注释factors.add(i); then number for which we are finding factors would be counted as well, if you need it that way. 如果你需要这样的话,那么我们找到因素的数字也将被计算在内。

Iterating 迭代

  // Iterator mapIt = numbers.keySet().iterator(); - you can only iterate thru map by using iterator

    for(int i = min; i <= max; i++){
        Iterator it = numbers.get(i).iterator();
        System.out.print("Iterating for number " + i+": ");
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();
    }

This should give you general idea, if you don't like using iterators then use ArrayList instead of Set, like Map<Integer, List<Integer>> 这应该给你一般的想法,如果你不喜欢使用迭代器,那么使用ArrayList而不是Set,比如Map<Integer, List<Integer>>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM