2009-11-01 66 views
1
class eulerThree { 

    public static void main(String[] args) { 

     double x = 600851475143d; 

     for (double z = 2; z*z <= x; z++) { 

      if (x%z == 0) { 

       System.out.println(z + "PRIME FACTOR"); 

      } 

     } 

    } 

} 

,輸出是:項目歐拉#3的Java解決方案問題

71.0 
839.0 
1471.0 
6857.0 
59569.0 
104441.0 
486847.0 

所以,我認爲486847是x的最大素因子,但項目歐拉說,否則。我沒有看到我的代碼或數學問題,所以我很困惑。你能看到我不能做的事嗎?

回答

4

首先,你必須使用一個精確的算術平均值。其他人建議使用BigInteger。你可以這樣做。對我來說,這感覺有點像作弊(對於後來遇到更大整數的問題,這會更重要),所以更有趣的方式(imho)是自己編寫必要的任意精度操作。

其次,600851475143足夠小,可以用long做到精確,這將更快。

第三,您的循環無法正確檢查素數因子。你只是檢查奇數。這是一個準系統(不完整)解決方案:

long num = 600851475143L; 
List<Long> factors = new ArrayList<Long>(); // or use a Set 
if (num & 1 == 0) { 
    factors.add(2L); 
} 
for (long i=3; i*i<=num; i+=2) { 
    // first check i is prime 
    // if i is prime check if it is a factor of num 
} 

檢查是否有素數具有不同的實現級別。最天真的:

public boolean isPrime(long num) { 
    for (long i=2; i<=num; i++) { 
    if (num % i == 0) { 
     return false; 
    } 
    } 
    return true; 
} 

當然這會做各種不必要的檢查。正如你已經確定你只需要檢查人數達到sqrt(n)便可消除偶數(2以外):

public boolean isPrime(long num) { 
    if (num & 1 == 0) { 
    return false; // checks divisibility by 2 
    } 
    for (long i=3; i*i<=num; i+=2) { 
    if (num % i == 0) { 
     return false; 
    } 
    } 
    return true; 
} 

但是你可以做得比這更好。另一個優化是,您只需要在該範圍內檢查素數。 63的主要因素是3和7.如果一個數不能被3或7整除,那麼它的定義將不能被63整除。

所以你想要做的是建立可能是Set<Long>或素數直到廣場等於或高於您的目標數量。然後,只需將這一系列數字整除到目標中即可。

2

double對於大數值本質上不準確,並且應該使用從不使用來進行這些類型的數字操作。正確使用的類是BigInteger,它允許精確地表示任意大的整數值。請參閱this wikipedia article以獲取關於什麼是浮點數據類型的描述。

1

首先,使用BigInteger或long而不是double。雙精度不準確,而當你遇到後面的問題時,它不會是正確的。

其次,您打印的是因素,而不是主要因素。

這工作你的情況:

for (double z = 2; z <= x; z++) { 
     if (x%z == 0) { 
        while(x%z == 0) 
         x = x/z 
       System.out.println(z + "PRIME FACTOR"); 
     } 
} 

此外,項目歐拉讓你品嚐的輸入和輸出。使用它,因爲你的代碼不會輸出與他們在問題中給出的例子相匹配的值。

1

兩件事情:

  1. 不要使用double,數量少的精度有較大的。相反,您可以使用BigInteger來存儲任意大的整數,或者在這種情況下,簡單的long就足夠了。

  2. 找到之後,您需要除以質量因子,否則您會發現所有因素不僅僅是素因素。事情是這樣的:

    if (x % z == 0) { 
        System.out.println(z + "PRIME FACTOR"); 
        x /= z; 
        z -= 1; // Might be present multiple times, try it again 
    } 
    
0
public class Prime { 
    public static void main(String[] args) { 
     double out = 0; 
     double m = 600851475143d; 
     for (double n = 3; n < m; n += 2) { 
      while (m % n == 0) { 
       out = n; 
       m = m/n; 
      } 
     } 
     System.out.println("" + ((m == 1)?out:m)); 
    } 
} 

查看程序。你會明白這個算法。這非常簡單而且非常快速。並返回正確的答案6857.

0
  import java.util.Scanner; 

      class Primefactor 
        { 
          public static void main(String args[]) 
           { 
         Scanner get=new Scanner(System.in); 
         System.out.println("Enter a number"); 
         long number=get.nextLong(); 
         int count=0; 
         long input=number; 
          for(long i=number;i>=1;number--) 
           { 
        for(long j=number;j>=1;j--) 
        { 
         if(i%j==0) 
         { 
          count++; 
         } 
         if(count==2) 
         { 
          if(input%j==0) 
           { 
           System.out.println(j); 
           } 
          } 
        } 
        } 
      } 
      } 

這是查看數據類型限制內任何數字的最大主因子。

0
public static void largestPrimeNo(long lim) 
{ 
long newNum = lim; 
long largestFact = 0; 

int counter = 2; 
while(counter * counter <= newNum) 
{ 
if(newNum % counter == 0) 
{ 
    newNum = newNum/counter; 
    largestFact = counter; 
}else{ 
counter++; 
} 
} 
if(newNum > largestFact) 
{ 
largestFact=newNum; 
} 
System.out.println(largestFact); 
} 
} 

擔任總理不爲的原則是Any integer greater than 1 is either a prime number, or can be written as a unique product of prime numbers所以我們可以很容易地使用上面program.In這個程序我們把不長,並發現它的首要因素

0
package findlaragestprimefactor; 

public class FindLaragestPrimeFactor{ 

    boolean isPrime(long number) { 
     for (long divider = 2; divider <= number/2; divider++) { 
      if (number % divider == 0) { 
       return false; 
      } 

     } 
     return true; 
    } 

    void calculateLargestPrimeFactor() { 
     long largestPrimeFactor = 0; 
     long x = 600851475143L; 
     for(long factor = 3 ; factor <= x/2 ; factor = factor + 2){ 
      if(x%factor==0 & factor>largestPrimeFactor & isPrime(factor)){ 
       largestPrimeFactor = factor; 
      } 
     } 
     System.out.println(largestPrimeFactor); 
    } 







    public static void main(String[] args) { 

     MyProject m = new MyProject(); 
     m.calculateLargestPrimeFactor(); 
    } 
} 
工作