【问题标题】:Converting a void Algorithm to an int []将 void 算法转换为 int []
【发布时间】:2019-10-01 22:45:46
【问题描述】:

所以我有一个程序可以找到一个数的素数分解。

public static void primeFactors(int number){
    int i=2;
    while(number>1){
        if (number%i==0){
        System.out.println(i);

            number/=i ;
        }else{
            i++;
            if(isPrime(i)==true){
                        System.out.println(i);

                number/=i;
            }else{
                i++;
}}}}

但问题是我希望它以数组的形式返回。并且它必须能够在 5 秒内取大量并运行。所以我将工作算法转换为:

public static int[] primeFactors2(int number){
    int[] arrayINT =new int[10];
    int i = 2;
    int index=0;
    while(i<=number/2){
        if(number %i==0 && isPrime(i)){
           arrayINT[index]=i;
           index++;
        }
        i++;
    }
    return arrayINT;
}}

这不会返回正确的结果,并且在速度方面效率不高。我到底做错了什么!

这里是isPrime():

     public static boolean isPrime(int number){
                if (number<2){
                        return false;
                }
                if (number==2){
                        return true;
                }
                if (number%2==0){
                        return false;
                }
                int ceiling=number; 
                for(int i=3;number>i&&ceiling>i;i+=2){   
                        if(number%i==0){
                                return false;
                        }
                        ceiling=number/i;   
              }  return true;
        }

【问题讨论】:

  • 你能分享isPrime吗?
  • 刚刚编辑过!
  • 我倾向于猜测第二个版本甚至没有编译,因为i++;} 有一个额外的右大括号(})。如果它确实编译了,那么它可能并不意味着你认为它的意思。
  • @JohnBollinger 是的,它不是一个额外的右括号。请看上面的空白,(效果很好)它有相同的
  • 这似乎也有一个逻辑问题。当我调用primeFactors(10) 时,它会打印 2 和 3。这是正确的吗?我相信答案应该是 2 和 5。

标签: java arrays optimization


【解决方案1】:

我已经稍微修改了代码以满足您的要求。请看一下。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

--

public static void main(String[] args) {
    primeFactors(630);
    System.out.println(Arrays.toString(primeFactors2(630)));

}

public static void primeFactors(int number) {
    int i = 2;
    int init = number;
    while(i<=init/2){
        if(number %i==0 && isPrime(i)){
            System.out.println(i);
            number/=i;
            i--;
        }
        i++;
    }
}

public static Integer[] primeFactors2(int number) {
    List<Integer> list = new ArrayList<>();
    int i = 2;
    int init = number;
    while(i<=init/2){
        if(number %i==0 && isPrime(i)){
            list.add(i);
            number/=i;
            i--;
        }
        i++;
    }
    return list.toArray(new Integer[list.size()]);
}

public static boolean isPrime(int number) {
    if (number < 2) {
        return false;
    }
    if (number == 2) {
        return true;
    }
    if (number % 2 == 0) {
        return false;
    }
    int ceiling = number;
    for (int i = 3; number > i && ceiling > i; i += 2) {
        if (number % i == 0) {
            return false;
        }
        ceiling = number / i;
    }
    return true;
}

【讨论】:

  • 编辑添加进口。我们无法初始化一个数组来存储结果,因为我们事先不知道会存在多少个因子。因此,我们使用List 来捕获值并将其转换为数组。我实际上建议您使用 List 作为返回类型。如果您认为解决方案令人满意,您可以接受答案,以便其他人知道问题已解决。
  • 面临的问题是什么?
  • 请看我编辑的 primeFactors2 版本。它没有返回它出现的正确输入
  • 事实上,我的朋友,您的主要因素也给出了不正确的输出。例如尝试 630 或 121@Pavan Kumar
  • 好的,我明白了你的逻辑。之前我只是打印因子,现在输出应该如你所料......它与这里的输出匹配:calculatorsoup.com/calculators/math/prime-factors.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2018-08-23
  • 1970-01-01
  • 2020-02-05
  • 2019-11-19
相关资源
最近更新 更多