Project Euler Question 3 Help

后端 未结 16 1326
攒了一身酷
攒了一身酷 2020-12-08 08:25

I\'m trying to work through Project Euler and I\'m hitting a barrier on problem 03. I have an algorithm that works for smaller numbers, but problem 3 uses a very, very large

相关标签:
16条回答
  • 2020-12-08 08:56

    Maybe it is considered cheating, but one possibility in haskell is to write (for the record I wrote the lines myself and haven't checked eulerproject threads);

    import Data.Numbers.Primes
    last (primeFactors 600851475143)
    
    0 讨论(0)
  • 2020-12-08 08:57

    All Project Euler's problems should take less then a minute; even an unoptimized recursive implementation in Python takes less then a second [0.09 secs (cpu 4.3GHz)].

    from math import sqrt
    
    def largest_primefactor(number):
        for divisor in range(2, int(sqrt(number) + 1.5)): # divisor <= sqrt(n)
            q, r = divmod(number, divisor)
            if r == 0:
                #assert(isprime(divisor))
                # recursion depth == number of prime factors,
                # e.g. 4 has two prime factors: {2,2}
                return largest_primefactor(q) 
    
        return number # number is a prime itself
    
    0 讨论(0)
  • 2020-12-08 08:58

    This solution on C++ took 3.7 ms on my Intel Quad Core i5 iMac (3.1 GHz)

    #include <iostream>
    #include <cmath>
    #include <ctime>
    
    using std::sqrt; using std::cin;
    using std::cout; using std::endl;
    
    long lpf(long n)
    {
      long start = (sqrt(n) + 2 % 2);
      if(start % 2 == 0) start++;
    
      for(long i = start; i != 2; i -= 2)
        {
          if(n % i == 0) //then i is a factor of n                                                
            {
              long j = 2L;
              do {
                  ++j;
                 }
              while(i % j != 0 && j <= i);
    
              if(j == i) //then i is a prime number                                           
                return i;
            }
        }
    }
    
    int main()
    {
      long n, ans;
      cout << "Please enter your number: ";
      cin >> n; //600851475143L                                                               
    
      time_t start, end;
      time(&start);
      int i;
      for(i = 0; i != 3000; ++i)
          ans = lpf(n);
      time(&end);
    
      cout << "The largest prime factor of your number is: " << ans << endl;
      cout << "Running time: " << 1000*difftime(end, start)/i << " ms." << endl;
    
      return 0;
    }
    
    0 讨论(0)
  • 2020-12-08 09:01

    For starters, instead of beginning your search at n / 2, start it at the square root of n. You'll get half of the factors, the other half being their complement.

    eg:

    n = 27
    start at floor(sqrt(27)) = 5
    is 5 a factor? no
    is 4 a factor? no
    is 3 a factor? yes. 27 / 3 = 9. 9 is also a factor.
    is 2 a factor? no.
    factors are 3 and 9.
    
    0 讨论(0)
  • 2020-12-08 09:01

    Actually, for this case you don't need to check for primality, just remove the factors you find. Start with n == 2 and scan upwards. When evil-big-number % n == 0, divide evil-big-number by n and continue with smaller-evil-number. Stop when n >= sqrt(big-evil-number).

    Should not take more than a few seconds on any modern machine.

    0 讨论(0)
  • 2020-12-08 09:03

    Using a recursive algorithm in Java runs less than a second ... think your algorithm through a bit as it includes some "brute-forcing" that can be eliminated. Also look at how your solution space can be reduced by intermediate calculations.

    0 讨论(0)
提交回复
热议问题