Учитывая список целых чисел от минимума до максимума, я пытаюсь найти список простых факторов, которые равномерно умножаются на любое из целых чисел в ранее заданном списке.
Например, дано каквведите список целых чисел [1 ... 10]
, программа выдаст [1, 2, 2, 2, 3, 3, 5, 7]
. Этот список содержит основные факторы для списка [1 ... 10]
, потому что 1*1=1
, 1*2=2
, 1*3=3
, 2*2=4
, 5*1=5
, 2*3=6
, 1*7=7
, 2*2*2=8
, 3*3=9
,& 2*5=10
.
В любом случае, для этого я создал метод (в Java) для перечисления всех целых чисел от минимального до максимального. Оттуда я построил метод, чтобы найти главные факторы любого данного целого числа. Используя этот метод простых факторов, я затем написал метод для перебора списка целых чисел, сохраняя текущий список основных факторов, необходимых для этих чисел, без добавления каких-либо дополнительных функций, которых еще нет в этом списке. Например, если нужны простые факторы только для 2 и 8, он найдет главные факторы 8 (2, 2 и 2) и главные факторы 4 (2 и 2). Однако, поскольку 2 и 2 уже есть в списке из-за главных факторов 8, они не будут добавлены. Конечно, в программе есть и другие вспомогательные методы, которые вполне могут иметь ошибки, но это основная структура.
Я протестировал эту программу в списке [1 ... 10]
и ожидал вывода [2, 2, 2, 3, 3, 5, 7]
, но вместо этого получил вывод [3, 3, 7]
. Похоже, что по какой-то причине, когда я беру относительное дополнение простых факторов для числа в списке целых чисел и в рабочем списке, некоторые числа в рабочем списке удаляются, но я не могу понять, почему.
Может кто-нибудь найти эту ошибку и сказать мне, почему это происходит?
Код:
import java.io.*;
import java.util.*;
import java.lang.Math;
class Main{
public static void main(String[] args){
System.out.println(listPrimeFactors(maxToMin(1, 10)));
}
public static ArrayList<Integer> listPrimeFactors(ArrayList<Integer> myList){
ArrayList<Integer> myFactors = new ArrayList<Integer>();
for(int j = 0; j < myList.size(); j++){
myFactors = addDifference(myFactors, primeFactors(myList.get(j)));
}
return myFactors;
}
private static ArrayList<Integer> addDifference(ArrayList<Integer> list1, ArrayList<Integer> list2){
ArrayList<Integer> tempList1 = list1;
Collections.sort(tempList1);
Collections.sort(list2);
for(int i = 0; i < list2.size(); i++){
if(inList(list2.get(i), tempList1)){
tempList1.remove(list2.get(i));
list2.remove(list2.get(i));
}
}
for(int r = 0; r < list2.size(); r++){
tempList1.add(list2.get(r));
}
System.out.println(list2 + " >>> " + tempList1);
return tempList1;
}
private static boolean inList(int n, ArrayList<Integer> myList){
for(int k = 0; k < myList.size(); k++){
if(n == myList.get(k)){
return true;
}
}
return false;
}
public static ArrayList<Integer> primeFactors(int n){
ArrayList<Integer> primeFactorsList = new ArrayList<Integer>();
while (n%2==0){
primeFactorsList.add(2);
n /= 2;
}
for (int i = 3; i <= Math.sqrt(n); i+= 2){
while (n%i == 0) {
primeFactorsList.add(i);
n /= i;
}
}
if (n > 2){
primeFactorsList.add(n);
}
return primeFactorsList;
}
public static ArrayList<Integer> maxToMin(int min, int max){
ArrayList<Integer> myList = new ArrayList<Integer>();
for(int i = max; i >= min; i--){
myList.add(i);
}
return myList;
}
}