2013-02-28 96 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

相关问题