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)
谢谢!!
答案 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