[英]Using nested arrays to show and count number of prime factors or other operations
我有一个算法,它计算给定数字范围的素因子。 例如10到20之间。
结果是:数字10:因素是:2,5。数字11:因素是:11。数字12:因素是:2,6等。...
但我想检查哪些数字只有2或3个或4个或更多的素因子。
我存储在数组中的那些数字。 我的想法是将这些个别素数因子分配给给定的数字。 所以我应该有一个arraylist,它正在动态变化(也就像大小一样)。
例如:
ArrayOfNumbers [0] = 10;
ArrayOfPrimeFactorsOf 10 Number [0] = 2; ArrayOfPrimeFactorsOf 10 Number [1] = 5;ArrayOfNumbers [1] = 11; ArrayOfPrimeFactorsOf 11 Number [0] = 11;
我可以通过获取属于多个数组(ArrayOfNumbers)的素因子数组(ArrayOfPrimeFactorsOf..Number)的大小来比较哪个数字具有例如2或3个素数因子=>并且还显示该数字及其素因子。
我的问题是:我怎么能把它作为嵌套数组(ArrayOfPrimeFactorsOf..Number)并将其分配给ArrayOfNumbers [..]?
也许您对如何解决这一挑战有任何其他想法?
以下是一个程序:
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);
}
我认为使用地图将是最好的解决方案,特别是TreeMap,key应该是您要查找因子的数字,而值应该是包含所有factros的其他集合。 例:
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());
这是一般的想法,您可以通过numbers.get(someNumber).size();
轻松获得每个数字的因子数量numbers.get(someNumber).size();
如果取消注释factors.add(i);
如果你需要这样的话,那么我们找到因素的数字也将被计算在内。
迭代
// 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();
}
这应该给你一般的想法,如果你不喜欢使用迭代器,那么使用ArrayList
而不是Set,比如Map<Integer, List<Integer>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.