Простая факторизация с использованием графического интерфейса (свинг / AWT) - PullRequest
0 голосов
/ 13 января 2019

Этот код использует Swing и awt для вычисления простой факторизации, код работает, но он показывает только один простой фактор, например: если я вычисляю 56, ответ - всего 7, как я могу это исправить? заранее спасибо

        calculate6.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // Get values from text fields
            try {
                int a = Integer.parseInt(input1.getText());
                result.setText(String.valueOf(a + " "));
                for (int i = 2; i <= a; i++) {
                    while (a % i == 0) {
                        result.setText(String.valueOf(i + " "));
                //        System.out.println(i + " ");
                        a = a / i;
                    }
                }
                if (a < 1)                     
                    result.setText(String.valueOf(a + " "));
                //        System.out.println(a + " ");

            }
                catch (Exception f) {
                JOptionPane.showMessageDialog(rootPane, "ERROR: " + (f.getMessage()));
            }

            String aField = input1.getText(); 
            if (e.getSource() == calculate6) {
                if ("".equals(aField)) {
                    String emptyFieldWarning;
                    emptyFieldWarning = "One field is empty!";
                    JOptionPane.showMessageDialog(rootPane, emptyFieldWarning);
                }
            }
        }
    });

Редактировать 1: я изменил операционную часть

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Проблема в цикле while. Это не накапливать факторы. Попробуйте это getPrimeFactors() в этом примере программы.

import java.util.*;

public class PrimeFactors {

  public static void main(String[] args) {
    System.out.println("56 -> " + PrimeFactors.getPrimeFactors(56));
    System.out.println("30 -> " + PrimeFactors.getPrimeFactors(30));
    System.out.println("154 -> " + PrimeFactors.getPrimeFactors(154));
  }

  public static List<Integer> getPrimeFactors(int input) {
    List<Integer> factors = new ArrayList<>();
    for (int i = 2; i <= input; i++) {
      while (input%i == 0) {
        input = input/i;
        factors.add(i);
      }
    }
    return factors;
  }
}
0 голосов
/ 14 января 2019
public static final IntFunction<String> getPrimeFactorsAsString = num -> {
    List<Integer> res = new ArrayList<>();

    for (int i = 2, sqrt = (int)Math.sqrt(num); i <= sqrt; i++) {
        while (num % i == 0) {
            res.add(i);
            num /= i;
        }
    }

    return res.stream().map(String::valueOf).collect(Collectors.joining(" "));
};

Демо

System.out.println(getPrimeFactorsAsString.apply(56));  // 2 2 2 7
System.out.println(getPrimeFactorsAsString.apply(660)); // 2 2 3 5 11
0 голосов
/ 13 января 2019

Ваша часть Swing в порядке. Если вы просто попытаетесь выполнить

 int a = 56;
    for(int i = 2; i< a; i++) {
        while (a % i == 0) {
            a = a / i;
        }
    }
    System.out.println(a);

вы получаете 7, так что проблема в этой части, посмотрите сюда

...