尋找600851475143的最大素因子的快速演算法

2022-06-14 14:48:13 字數 761 閱讀 4957

這是一道作業題.

參考的是stackoverflow的第3個回答, 這個方法非常好, 據同學在群裡說, 用那種遍歷到sqrt(n)的辦法, 需要將近一分鐘. r速度是很慢的, 但是得到這個結果不到0.1s.

其實核心思路很簡單: 從小到大的素數, 如果i是n的因子, 就一直除以i, 直到n不再包含因子i. 那麼之後最小的因子都一定大於i.

這個回答加了一點優化: 素數一定是6n-1或者+1. 但這並不是關鍵. 優化意義不大, 大概減少了1/3的時間(6個數, 如果+=2, 是3次, 這裡變成了2次).

time1=sys.time()

num=600851475143

if(num%%3==0)

}six_m=6

sqrt_n=floor(sqrt(num))

while(six_m-1<=num)

} tmp=six_m+1

if(num%%tmp==0)

} six_m=six_m+6

}time2=sys.time()

print(time2-time1)

print(max_f)

我開始犯了乙個錯誤, 把上限寫成了floor(sqrt(num)), 這顯然不對, 比如14最大素因子是7. 我有這個潛意識, 大概是因為很早以前做因數分解留下的印象吧.

複雜度分析

簡單分析一下, sqrt(num)那種方式, 複雜度是o(sqrt(n)), 這種方式複雜度是o(log(n)), 顯然強得多.

尋找崩潰的真相

2003 年 10 月 如何開發 web 應用呢?有幾種人,採用幾種不同的方法 第一種人 寫程式 一行行寫 coding line by line 這種人真 老實 第二種人 抄程式 最常使用的動作是複製與貼上 copy paste 這種人算 聰明 第三種人 用程式 使用免費 free 的程式,這種人...

尋找缺失的數

有一組數字,從1到n,中減少了乙個數,順序也被打亂,放在乙個n 1的陣列裡 請找出丟失的數字,最好能有程式,最好演算法比較快 btw1 有很多種方法的哦,據說o n 的方法就不止一種 btw2 擴充套件問題,如果丟失了2個數字呢?btw3 一定要小心不要溢位,嗯,面試者有時候不會提醒你的 btw4 ...

尋找最小的祖先

題目 給定乙個binary search tree 和兩個節點,尋找這兩個節點的最小公共祖先。首先要盡快給出最直接的辦法,不要管效率的問題。可以利用額外的儲存空間來解決這個問題,先用dfs分別尋找到這兩個元素,並且記錄下尋找過程中遍歷的元素,得到兩個陣列。然後挨個比較陣列中的元素,直到出現不同的為止...