尋找因數 演算法簡化

2021-09-11 07:08:07 字數 1622 閱讀 2027

如果你想找到乙個數字的所有的因數,你會怎麼做?

首先的問題是:因數是什麼?簡言之,如果乙個數字能夠被另乙個數字整除,並且第二個數字小於等於第乙個數字,那麼第二個數字就是第乙個數字的乙個因數。比如說,10%2=5…0,因此2是10的因數。

基於定義,我們不難想出這個方法:

for numbercounter in range(1, inputnumber + 1):

if inputnumber % numbercounter == 0:

print(numbercounter, "is a divisor of", inputnumber)

上面的方法的問題是消耗時間。讓我們看看下面這幅圖:

不難看出,乙個數的因數,除了它自身以外,不會比自己一半的值大。例如,64的第二個因數是32,28的第二個因數是14,9的第二個因數是3。

因此我們只需要搜尋從1到一半被搜尋數的數。

for numbercounter in range(1, int(inputnumber/2 + 1)):

if inputnumber % numbercounter == 0:

print(numbercounter, "is a divisor of", inputnumber)

print(inputnumber, "is a divisor of", inputnumber)

但我們還可以讓這個演算法更快。

如果你觀察乙個數字的各個因數,你可以發現因數總是成對存在。換句話說,你可以通過乙個數的兩個特定的因數的乘積 得出這個數。如果你已經知道了乙個因數,你可以用這個數/因數來得出它的另乙個因數。

因此,我們不必再從1到原數一半這樣查詢。我們可以在原數的平方根處停下來,如果平方根不是整數,我們取小。

import math

inputnumber = int(input())

squareroottoint = math.sqrt(inputnumber)

if squareroottoint != int(squareroottoint):

squareroottoint = int(squareroottoint)

for numbercounter in range(1, int(squareroottoint) + 1):

if inputnumber % numbercounter == 0:

print("you've fount a divisor of", inputnumber, "and it is", numbercounter)

if numbercounter != inputnumber / numbercounter:

print("you also found a mate for it:", int(inputnumber / numbercounter))

JoyOI1020 尋找質因數

時間限制 記憶體限制 評測方式 題目 1000ms 131072kib 標準比較器 local 給出n個數字,試求質因數最大的數字。第一行,乙個整數n,表示數字個數。接下來n行,每行乙個整數a i,表示給出的數字。乙個整數,表示質因數最大的數字。n 5000 a i 20000 舉例 38和12 3...

演算法 分解質因數

定義 質因數 或質因子 在數論裡是指能整除給定正整數的質數。兩個沒有共同質因子的正整數稱為互質。因為1沒有質因子,1與任何正整數 包括1本身 都是互質。正整數的因數分解可將正整數表示為一連串的質因子相乘,質因子如重複可以指數表示。根據算術基本定理,任何正整數皆有獨一無二的質因子分解式。只有乙個質因子...

分解質因數演算法

題目 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。分析 從1到n先找出最小的質因數,如果等於本身,那麼說明只有乙個質因數,如果不是,那麼將該質因數列印出來,並將n 該質因數作為新的n值進行運算。設計步驟 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2...