如何在速度方面优化此JAVA代码?

时间:2012-02-10 19:46:47

标签: java numbers

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之间找到总数的问题,其数字之和和数字平方和是素数。但我需要让它成为最佳。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

代码优化可能很棘手。 使代码最佳可以是不同的。

有很多子问题: 在速度/记忆方面的优化? 在哪台设备上? 从一个新的开始,或经过长时间运行?

但首先,给变量一个显式名称,因为A,B,T对我/其他代码没有任何意义,而较长的变量名也不会减慢你的代码速度。 二,使用分析器可能对你有帮助,我通常使用jvisualvm.exe(在jdk中)。 第三,在其他计算机/设备上,机器上的代码更快,无需更快。

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

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

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

答案 1 :(得分:0)

您在isPrime中检查的数字超出了您的需要。你只需要检查sqrt(sum),因为如果sum是可以计算的,它必须至少有一个因子&lt; =它的平方根。

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) && isPrime(sum1);