2012-02-10 106 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);