为什么我对项目euler 3的回答不起作用?

时间:2015-11-03 17:19:55

标签: python primes

我一直试图解决项目欧拉问题#3一段时间了。下面的代码仍然没有按照我想要的方式工作。

  

问题3:13195的主要因素是5,7,13和29。

     

600851475143号码的最大主要因素是什么?

 getal = 13195
    x = 2 

    while x in xrange(2,getal):
        if getal % x == 0:
            num = getal / x
            for i in xrange (2,num):
                    if num % i == 0:
                        x += 1
                        break
                    else:
                        print num
        else:
            x += 1
            continue

正如您所看到的,为了简单起见,我现在使用13195运行它,但最终它应该使用更大的数字。

我的输出是:

2639 2639 2639 2639 2639 1885 1885 1885 1015 1015 1015 455 455 455 377
377 377 377 377 377 377 377 377 377 377 203 203 203 203 203 145 145
145 91 91 91 91 91 65 65 65 35 35 35 29 29 29 29 29 29 29 29 29 29 29
29 29 29 29 29 29 29 29 29 29 29 29 29 29

29比我展示的时间长了一段时间。 我明白它只是在找到一个" i"这个数字不能除以。但我不知道如何阻止它这样做。因为最终29是正确的答案,但它应该只是一次性地给出这个答案。

8 个答案:

答案 0 :(得分:1)

您可以将代码简化为以下代码段。它使用一个列表来存储任何候选者,如果它们不是素数,则删除它们:

import math

getal = 600851475143
x = 2 
candidates = [];
while (x < int(math.sqrt(getal)+1)):    
    if getal % x == 0:                
        candidates.append(x)
        for i in xrange (2,int(math.sqrt(x)+1)):
             if x % i == 0:
                 candidates.remove(x)
                 break        
    x = x + 1
print str(candidates).strip('[]')        

答案 1 :(得分:0)

找到答案后,您需要break while

答案 2 :(得分:0)

incrementing 'x'声明后你不是print num

  for i in xrange (2,num):
      if num % i == 0:
         break
      else:
         print num
  x += 1

你应该能够对第二个if语句进行getrid,如下所示

getal = 13195
x = 2 
while x in xrange(2,getal):
  if getal % x == 0:
      num = getal / x
      for i in xrange (2,num):
          if num % i == 0:
             break
          else:
             print num
  x += 1

答案 3 :(得分:0)

答案是6857.你不必从2号检查号码。使用prime的属性。仅检查您正在检查的数字的平方根。您可以使用我的Java代码作为参考。

class p3{
public static boolean isprime(long y){
    double sq = Math.sqrt(y);
    long endl =(long) (sq+.5);
    for(long j = 2;j <=endl ;j++)
    {
        if(y%j==0){
        return false;
        }
    }
    return true;
}

public static void main(String []asd){
    long test = 600851475143L;
    long ans =-1;
    double e = Math.sqrt(test);
    long end = (long)(e+1);
    for(long i = 2 ; i <= end ;i++)
    {

        if(test%i==0){
            boolean val = isprime(i);
            if(val){
            ans = i;
            }
        }
    }
    System.out.println(ans);
}
}

如果您需要任何帮助。我已经解决了Project Euler中的问题并将它们保存在我的github存储库中。非常欢迎您来分叉。网址是: https://github.com/vatsarahul999/ProjectEuler-.git

在python中编写相同的代码。

 def isprime(n):
   if n < 2:
     return False
  if n == 2: 
    return True    

  if not n & 1: 
    return False

   for x in range(3, int(n**0.5)+1, 2):
      if n % x == 0:
        return False
   return True

现在是主程序

v = 13195
x = 2
while(x*x <= v)
  if(isprime(x)):
       a = x
       while(v%x==0)
           v=v/x;
  x++
  print a

答案 4 :(得分:0)

这是一个样本(可以在性能方面进行改进):

  public IEnumerable<product> AddProducts(IEnumerable<Product> pList)
       {
           List<product>  pNewProducts = new List <product>();
           Product prod = new Product();
           foreach (Product p in pList)
           {
               prod = Get(p.Id); // get item being updated
               if (p.Equals(Add(p)))
                   pNewProducts.Add(p);
           }
           return pNewProducts; // return collection of added products
       }

答案 5 :(得分:0)

为什么每个人都在增加以找到最大的数字?减少!!!

def largestPrime(num):
  from __future__ import division
  for i in xrange(num//2 + 1, 1, -1):
    if num%i == 0 and all([i%j != 0 for j in range(2,i//2 + 1)]):
      return i

答案 6 :(得分:-1)

你过度复杂,得到所有因素

getal = 13195
for x in range(2, getal):
    if getal % x == 0:
        print x

这个应该使用for循环不一会儿, 在这里使用一段时间就像这样

getal = 13195
x = 2
while x < getal:
    if getal % x == 0:
        print x
    x += 1

你不需要循环通过约束来完成循环级别的工作 - 因为你在里面做了

答案 7 :(得分:-1)

你实际上非常接近得到正确的答案,你只需要在你的else语句中删除缩进以获得for else块:

>>> x = 2
>>> getal = 13195
>>> while x in range(2,getal):
        if getal % x == 0:
            num = getal // x
            for i in range (2,num):
                    if num % i == 0:
                        x += 1
                        break #this will break for loop
            else:#this is the only change, moving the else from an else inside of the for to a for else block
                    print (num)
                    break this will break while loop
        else: 
            x += 1
            continue


29

对于大多数人来说这是令人惊讶的,因为for-else语句并不是很清楚,但它几乎意味着只有在没有退出for块的情况下才运行else块。

考虑到这一点,是的,这段代码可行,但正如很多其他人所说,这不是完成这项任务的最佳方法。因为@RahulVasta已经发布了一个足够好的答案,我不会。这并不是说你的逻辑不起作用,但是,由于这是编程,有无限的方法来处理问题,有些方法比其他方法更好。