【问题标题】:Prime factorization using GUI (swing/awt)使用 GUI 的素数分解(swing/awt)
【发布时间】:2019-06-07 19:09:45
【问题描述】:

此代码使用 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:我改变了操作部分

【问题讨论】:

    标签: java swing jpanel awt jtextarea


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      问题出在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;
        }
      }
      

      【讨论】:

      • 试过了,但仍然得到相同的值
      • 您是否运行了我在解决方案中提供的这个程序?它对我有用。
      • 是的,现在正在运行,但仍显示最后一个值,是我在控制台中添加 System.out.println(...) 我看到所有值,但在 JTextField 我看到最后一个值
      • 您是否将值设置为result.setText((result1)); 的文本字段?我想您也可以在setText() 中使用您用于System.out.println() 的值。
      • 我已经更改了我的代码,但仍然显示最后一个值(System.out.println() 用于测试目的)
      【解决方案3】:

      你的 Swing 部分很好。如果你只是尝试执行

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

      你得到了7,所以问题出在这部分,你应该看这里

      【讨论】:

        猜你喜欢
        • 2021-11-09
        • 2010-10-07
        • 2010-12-17
        • 2013-09-25
        • 2012-04-17
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多