2013-02-28 72 views
-1

我正在研究應該顯示數字的最大因子的應用程序,它也必須是素數。如何從循環中獲取最後一個數字

這是我的應用程序:

public class BiggestFactor { 

public static void main(String[] args) { 

    double dev = 0d; 
    for (double j = 0; j < 984654354654d; j++) { 

     if (984654354654d % j == 0) { 
      dev = j; 
     } 

     // show dev when is a prime number 
     double i; 
     for (i = 2; i < dev; i++) { 

      double n; 
      n = dev % i; 

      if (n == 0) { 
       // do nothing - not a prime number 
       break; 
      } 
     } 
     if (i == dev) { 
      System.out.println(dev); 
     } 
    } 
} 
} 

,我的問題是如何得到的結果剛剛過去的數?在我的情況下,我得到一堆數字。

+1

如何從結束開始循環並打印第一個數字? – Shivam 2013-02-28 00:24:43

回答

3

最小變化是聲明一個新的變量result:在result

double result = -1; 

而不是打印dev和,簡單地保存它的值:

 if (i == dev) { 
      result = dev; 
     } 

然後,在端部功能,打印result

System.out.println(result): 
+0

非常感謝;) – knowbody 2013-02-28 00:31:06

+0

順便說一句,是最有效的方法來計算呢? – knowbody 2013-02-28 00:33:27

+1

@knowbody:不,絕對不會。你應該把'984654354654d'存儲在一個變量中 - 比如''x'',並且每當你找到一個因子時,你應該用這個因子除以'x'並重試相同的因子。除了讓你更快地終止(通過降低'x'),這也可以讓你消除'j'的素性測試,因爲它隱含在算法中。此外,只要'j * j> x'就可以終止,因爲此時唯一剩下的主要因素是'x'本身(這是您實際想要打印的內容)。 – ruakh 2013-02-28 01:19:09

1
public class BiggestFactor 
{ 
    public static void main(String[] args) 
    { 
     double dev = 0d; 
     double last = dev; 
     for (double j = 0; j < 984654354654d; j++) 
     { 
      if (984654354654d % j == 0) 
      { 
       dev = j; 
      } 
      double i; 
      for (i = 2; i < dev; i++) 
      { 
       double n; 
       n = dev % i; 
       if (n == 0) 
       { 
        break; 
       } 
      } 
      if (i == dev) 
      { 
       last = dev; 
      } 
     } 
     System.out.println(last); 
    } 
} 
+0

感謝ü那也有用 – knowbody 2013-02-28 00:31:28

0

我已經做了一些重構,並移動了在另一個函數中檢查素數的邏輯以便更好地理解。也改變了數1001增加驗證速度:P

public class BiggestPrimeFactor { 

    public static void main(String[] args) { 

     double dev = 0d; 

     double numberToCheck = 1001d; 

     for (double j = 0; j <= numberToCheck/2; j++) { 

      if (numberToCheck % j == 0 && isPrime(j)) { 

       dev = j; 

      } 
     } 

     System.out.println(dev); 
    } 

    private static boolean isPrime(double n) { 
     boolean prime = true; 

     for (long i = 2; i <= n/2; i += 2) { 

      if (n % i == 0) { 

       prime = false; 
       break; 

      } 
     } 

     return prime; 
    } 
} 

基本上,什麼是做它不斷更新dev是當前最大的主要因素。

+1

將這項工作的'numberToCheck = 1006D;'?它會打印什麼? – 2013-02-28 15:56:16

+0

@WillNess謝謝你發現了這個錯誤。現在更新代碼。 – Ankit 2013-02-28 18:18:46

+0

不錯;現在可以在不到0.1秒的時間內通過改變算法來達到原始大數目的目的,正如在對ruakh答案的評論中所解釋的那樣。 :) – 2013-02-28 18:45:32

相關問題