2012-02-10 114 views
0
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之间找到总数,其数字总和和数位平方总和为总数的问题。但我需要做到最佳。我怎么能这样做?如何以速度速度优化此JAVA代码?

+1

第一个答案为[这个问题](http://stackoverflow.com/questions/2842418/prime-numbers-code-help)会给你一个更好的方法,以确定是否数字是否为素数。你也可能会看到[这个问题](http://stackoverflow.com/questions/1969330/printing-out-prime-numbers-from-array)。 – 2012-02-10 19:50:47

+2

你应该问一个具体的问题。如果你希望你的代码审查 - 你应该尝试在[stackexchange代码审查(http://codereview.stackexchange.com/) – amit 2012-02-10 19:53:37

回答

0

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

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

但首先,给变量明确的名字,因为A,B,T对我毫无意义/别人的代码,和更长的变量名不会减慢您的代码。 二,使用profiler可能对你有所帮助,我通常使用jvisualvm.exe(在jdk中)。第三,在其他计算机/设备上,机器上的快速代码不一定要更快。

在你getLucky方法,幸运的变量是没有必要的,你可以这样做: 返回(isPrime(总和)& & isPrime(SUM1));

但它会使您的代码不易读。

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

0

您在isPrime中检查的数字多于您的需要。你只需要检查sqrt(总和),因为如果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) && isPrime(sum1);