簡體   English   中英

Python首要因素

[英]Python Prime Factors

我再次陷入一個問題。.我想創建一個函數,將給定數字的所有主要因素排除在外。 它幾乎完成了,但是它不會為具有相同主要因子的數字給出正確的因子,例如:20-5,2,2因此,我添加了一個while循環來檢查所有因子的乘積是否等於我輸入的號碼。感謝您的幫助:)

prime_numbers = []

def prime_gen(upper_limit):
    for i in range(2, upper_limit):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            prime_numbers.append(i)
    return prime_numbers



def list_product(list):
    sum = 1
    for i in list:
        sum *= i
    return sum




prime_factors = []
def prime_factor(number):
    while list_product(prime_factors) != number:    #without the while it checked every factor only once
        for i in reversed(prime_gen(number)):
            while number % i != 0:
                break
            else:
                if i != 1:
                    number /= i
                    prime_factors.append(i)
                    continue
                else:
                    break

prime_factor(20)
print (prime_factors)

只需使用for循環,即可從prime_gen獲取質數列表:

def prime_gen(upper_limit):
    prime_numbers = [2]
    for i in range(3, upper_limit,2):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            prime_numbers.append(i)
    return prime_numbers


def prime_factors(n):
    p_f = []
    for prime in prime_gen(n):
        # while n is divisible keep adding the prime
        while n % prime == 0:
            p_f.append(prime)
            # update n by dividing  by the prime
            n //= prime
    if n > 1:
        p_f.append(n)
    return p_f

print(prime_factors(40))
[2, 2, 2, 5] # ->  2*2*2*5 

如果以40為例:

(40, 2) # first prime 2, 40 is divisible by 2
(20, 2) # 40 //= 2 == 20, 20 is divisible by 2
(10, 2) # 20 //= 2 == 10, 10 is divisible by 2
(5, 5)  # 10 //=2 == 5, 5  is not evenly divisible by 2 or 3 so we get 5

如果要快速生成質數,可以使用篩子

 from math import sqrt

def sieve_of_eratosthenes(n):
    primes = range(3, n + 1, 2) # primes above 2 must be odd so start at three and increase by 2
    for base in xrange(len(primes)):
        if primes[base] is None:
           continue
        if primes[base] >= sqrt(n): # stop at sqrt of n
            break
        for i in xrange(base + (base + 1) * primes[base], len(primes), primes[base]):
            primes[i] = None
    primes.insert(0,2)
    sieve=filter(None, primes)
    return  sieve

您收到的錯誤( TypeError: 'float' object cannot be interpreted as an integer )最終是由以下語句引起的:

                number /= i

在Python 3中, /=的結果始終是浮點數。 要執行整數除法(以使number保持整數),請使用:

                number //= i

解決此問題后,您會發現存在導致無限循環的邏輯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM