Почему моя программа для перечисления основных факторов в списке чисел возвращает неожиданные значения? - PullRequest
0 голосов
/ 25 октября 2019

Учитывая список целых чисел от минимума до максимума, я пытаюсь найти список простых факторов, которые равномерно умножаются на любое из целых чисел в ранее заданном списке.

Например, дано каквведите список целых чисел [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;
  }
}

1 Ответ

1 голос
/ 25 октября 2019

Вы не должны удалять элементы из списка во время его циклирования без итератора, см. Этот вопрос . Более того, вы продолжаете работать со своим временным списком (где элементы уже удалены) вместо вашего рабочего списка.

Вот пример таких изменений:

private static ArrayList<Integer> addDifference(ArrayList<Integer> list1, ArrayList<Integer> list2){
    ArrayList<Integer> tempList1 = new ArrayList<>(list1);
    for (Iterator<Integer> iterator = list2.iterator(); iterator.hasNext();) {
        Integer value = iterator.next();
        if (inList(value, tempList1)) {
            iterator.remove();
            tempList1.remove(value);
        }
    }

    for (int r = 0; r < list2.size(); r++){
        list1.add(list2.get(r));
    }

    System.out.println(list2 + " >>> " + list1);

    return list1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...