在python中坚持项目Euler#3

时间:2012-10-21 16:22:44

标签: python math primes

  

13195的主要因素是5,7,13和29.最大的是什么   数字的主要因素600851475143?

好的,所以我正在处理python中的项目euler问题3。我有点困惑。我不知道我在这个程序中得到的答案是否正确。如果somone可以请告诉我我做错了什么会很棒!

#import pdb

odd_list=[]
prime_list=[2] #Begin with zero so that we can pop later without errors.

#Define a function that finds all the odd numbers in the range of a number
def oddNumbers(x):

    x+=1 #add one to the number because range does not include it
    for i in range(x):
        if i%2!=0: #If it cannot be evenly divided by two it is eliminated
            odd_list.append(i) #Add it too the list

    return odd_list 

def findPrimes(number_to_test, list_of_odd_numbers_in_tested_number): # Pass in the prime number to test
    for i in list_of_odd_numbers_in_tested_number:
        if number_to_test % i==0:
            prime_list.append(i)
            number_to_test=number_to_test / i

            #prime_list.append(i)
            #prime_list.pop(-2) #remove the old number so that we only have the biggest

    if prime_list==[1]:
            print "This has no prime factors other than 1"
    else:
            print prime_list
    return prime_list

#pdb.set_trace()

number_to_test=raw_input("What number would you like to find the greatest prime of?\n:")

#Convert the input to an integer
number_to_test=int(number_to_test)

#Pass the number to the oddnumbers function
odds=oddNumbers(number_to_test)

#Pass the return of the oddnumbers function to the findPrimes function
findPrimes(number_to_test , odds)        

谢谢!!

9 个答案:

答案 0 :(得分:6)

简单的解决方案是试验分工。让我们通过13195的因式分解,然后你可以将这个方法应用于你感兴趣的更大数字。

从2的试验除数开始; 13195除以2叶剩余1,所以2不分13195,我们可以继续下一个试验除数。接下来我们尝试3,但剩下1;然后我们尝试4,但是留下3的余数。下一个试验除数是5,并且确实除以13195,所以我们输出5作为因子13195,将原始数减少到2639 = 13195/5,并尝试5再次。现在2639除以5,剩余4,所以我们前进到6,剩下的是5,然后我们前进到7,它除了2639,所以我们输出7作为2639的因子(也是13195)并再次将原始数字减少到377 = 2639 / 7.现在我们再次尝试7,但它没有划分377,8和9,以及10,11和12除外,但是13除以2639.所以我们输出13作为377(和2639和13195)的除数,并将原始数字再次减少到29 = 377 / 13.由于这一点我们完成了,因为试验除数的平方仍然是13,更大比剩下的数字29,证明29是素数;那是因为如果 n = pq ,那么 p q 必须小于或等于n的平方根,并且既然我们已经尝试了所有这些除数,剩下的数字29就必须是素数。因此,13195 = 5 * 7 * 13 * 29。

这是算法的伪代码描述:

function factors(n)
    f = 2
    while f * f <= n
        if f divides n
            output f
            n = n / f
        else
            f = f + 1
    output n

有更好的方法来计算整数。但是这种方法对于Project Euler#3以及许多其他分解项目来说已经足够了。如果你想进一步了解素数和分解,我谦虚地在我的博客上推荐文章Programming with Prime Numbers,其中包括上述算法的python实现。

答案 1 :(得分:3)

  • 数字600851475143很大,不鼓励你使用蛮力。
  • oddNumbers函数将600851475143 / 2数字放入odd_list,即很多的内存。
  • 检查数字是否可以除以奇数并不意味着奇数是素数。你提供的算法是错误的。
  • 关于素数有很多数学/算法技巧,你应该在线搜索然后筛选答案。您可能还会到问题的根以确保平方某些问题。

您可以使用生成器来获取赔率列表(不是它会帮助您):

odd_list = xrange(1, number+1, 2)

这里是处理素数所需的概念:

如果你真的卡住了,那么已经有了解决方案:

答案 2 :(得分:0)

'''
The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?
'''
import math

def isPrime(x):
    if x<2:
        return False
    for i in range(2,int(math.sqrt(x))):
        if not x%i:
           return False
    return True

def largest_factor(number):
    for i in range (2, int(math.sqrt(number))):
        if number%i == 0:
            number = number/i
            if isPrime(number) is True:
                max_val = number
                break
                print max_val
        else:
            i += 1
    return max_val

largest_factor(600851475143)

这实际上编译速度非常快。它检查形成的数字是否为素数。 感谢

答案 3 :(得分:0)

这是我的Python代码:

num=600851475143
i=2 # Smallest prime factor
for k in range(0,num):
    if i >= num: # Prime factor of the number should not be greater than the number
        break
    elif num % i == 0: # Check if the number is evenly divisible by i
        num = num / i
    else:
        i= i + 1
print ("biggest prime number is: "+str(num))   

答案 4 :(得分:0)

使用Python解决此问题的另一种方法。

def lpf(x):
lpf=2
while (x>lpf):
    if (x%lpf==0):
        x=x/lpf

    else:
        lpf+=1
return x
print(lpf(600851475143))

答案 5 :(得分:0)

i = 3
factor = []
number = 600851475143
while i * i <= number:
    if number % i != 0:
        i += 2
    else:
        number /= i
        factor.append(i)
while number >= i:
    if number % i != 0:
        i += 2
    else:
        number /= i
        factor.append(i)
print(max(factor))

答案 6 :(得分:0)

这是我的python代码

a=2
list1=[]
while a<=13195:                     #replace 13195 with your input number
    if 13195 %a ==0:                #replace 13195 with your input number
        x , count = 2, 0
        while x <=a:
            if a%x ==0:
                count+=1
            x+=1
        if count <2:
            list1.append(a)
    a+=1

print (max(list1))

答案 7 :(得分:0)

这是我的python代码:

import math
ma = 600851475143
mn = 2
s = []
while mn < math.sqrt(ma):
    rez = ma / mn
    mn += 1
    if ma % mn == 0:
        s.append(mn)
print(max(s))

答案 8 :(得分:0)

kid