【问题标题】:How Can I Optimize this JAVA code in tems of Speed?如何在速度方面优化此 JAVA 代码?
【发布时间】:2012-02-10 19:46:47
【问题描述】:
import java.util.Scanner;

public class Problem1 {
    static int T,ans[];
    static long A,B;
    public static void main(String ar[]){
        Scanner scan=new Scanner(System.in);
        T=scan.nextInt();
        ans=new int[T];
        for(int i=0;i<T;i++){
            A=scan.nextLong();
            B=scan.nextLong();
            for(long j=A;j<=B;j++){
                if(getLucky(j)){
                    ans[i]++;
                }
            }
        }
        for(int i=0;i<T;i++){
            System.out.println(ans[i]);
        }
    }
    public static boolean getLucky(long j){
        boolean lucky=false;
        long rem,sum=0,sum1=0;
        while(j>0){
            rem=j%10;
            sum=sum+rem;
            sum1=sum1+(rem*rem);
            j=j/10;
        }
        if(isPrime(sum)&&isPrime(sum1)){
            lucky=true;
        }
        return lucky;
    }
    public static boolean isPrime(long sum){
        boolean status=true;
        if(sum!=1){
            for (int i=2; i < sum ;i++ ){
              int n = (int) (sum % i);
              if (n==0){
                    status=false;
                    break;
              }
            }
        }else{
            status=false;
        }
        return status;
    }
}

此代码用于解决我在 A 和 B 之间找到一个总数的问题,其数字总和和数字平方和是素数。但我需要使它成为最优的。我该怎么做?

【问题讨论】:

  • this question 的第一个答案将为您提供一种更好的方法来确定一个数字是否为质数。您可能还会看到this question
  • 你应该问一个具体的问题。如果您希望审查您的代码 - 您应该尝试stackexchange code review

标签: java numbers


【解决方案1】:

代码优化可能很棘手。 使代码优化可能会有所不同。

有很多子问题: 优化,在速度/内存方面? 在哪个设备上? 重新开始,还是经过长时间的运行?

但是首先,给变量一个明确的名字,因为 A,B,T 对我/其他代码没有任何意义,更长的变量名不会减慢你的代码。 其次,使用分析器可能会对你有所帮助,我通常使用 jvisualvm.exe(在 jdk 中)。 第三,您机器上更快的代码在其他计算机/设备上不一定会更快。

在您的 getLucky 方法中,幸运变量不是必需的,您可以这样做: return (isPrime(sum)&&isPrime(sum1));

但它会降低您的代码的可读性。

在您的 isPrime 方法中,for 循环检查 i 是否为整数且总和是否为 long。因此,如果总和大于 MAX_INTEGER,您将遇到麻烦。

【讨论】:

    【解决方案2】:

    您在 isPrime 中检查的数字超出了您的需要。您只需要检查 sqrt(sum),因为如果 sum 是可因式分解的,则它必须至少有一个因数

    public static boolean isPrime(long sum){
        boolean status=true;
        if(sum!=1){
            int limit = Math.sqrt(sum);
            for (int i=2; i <= limit;i++ ){
              int n = (int) (sum % i);
              if (n==0){
                    return false;
    
              }
            }
        }else{
            status=false;
        }
        return status;
    }
    

    我还看到了其他一些小东西。就像您不断设置布尔值然后返回它们一样。一旦你知道这个数字不是素数,就立即返回。无需设置状态,跳出循环然后返回。 getLucky() 也是如此。代替 if(isPrime(sum)&&isPrime(sum1)){ lucky=true; } 使用return isPrime(sum) &amp;&amp; isPrime(sum1);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 2012-05-17
      • 2017-08-09
      • 1970-01-01
      • 2011-04-09
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多