C 中如何減少for迴圈次數?

時間 2021-05-29 22:20:26

1樓:星空妄想者

這個問題是求出所有的約數。問題的本質和for無關。

乙個求解素數的基本演算法是開根號後縮小範圍進行求解。對這個問題也適用。

但是這個問題的本質不是求解素數而是求解約數。所以可以通過每次求解最小約數來達成簡化問題。這個數就變成了乙個新的數和這個最小約數的乘積。這樣問題就轉化為乙個遞迴問題了。

2樓:Muchan

18次方,long long範圍……

時限多少,1秒嗎?

這真的是給剛學迴圈的做的題?

提供乙個優化:只迴圈到sqrt(n),找到能整除的數時把除出來的商也存起來,迴圈完倒序輸出。記得判斷一下n是不是平方數,別重複了。

壓到10億次,有點不超時的希望了,再T的話……加個尤拉篩?我不確定會不會成為負優化……

3樓:徐欣

你需要避免:

for()

}盡量調整為:

for()

for()

4樓:神念的經

你可能說的是迴圈巢狀層數太多了導致演算法時間複雜度太大。

縮減時間咋辦?當然是優化演算法嘍,讓演算法不需要那麼多迴圈巢狀。

乙個典型的例子:給定一正整數 n ,找出所有和為 n 的勾股數三元組 (a, b, c) (a < b < c) 。

你很可能直接上三層迴圈,a 從 1 到 n/3 ,b從 1 到 n/3 ,c 從 1 到 n/3 ,途中做個判斷剪個枝。

這樣一來你演算法的時間複雜度就是 O(n^3) ,搞個 n = 100000 你時間鐵定會超。

你想 c = n-a-b ,能少一層迴圈,時間複雜度成了 O(n^2) 。搞個 n = 10000000,你時間還是有可能超。

這題演算法能再簡化億點。考慮到:

a*a + b*b = c*c

a*a = c*c - b*b

a*a = (c+b)*(c-b)

a*a = (n-a)*(n-a-2b)

a*a/(n-a) = n-a-2b

2b = n-a - a*a/(n-a)

b = [(n-a) - a*a/(n-a)] / 2

你把 a 和 n 代進去算出來不是正整數就可以棄了。

現在,你只需要一層迴圈了。

題主還有可能想問的是迴圈層數不變,如何減少每層的迴圈次數。這就要談到剪枝了。迴圈過程中,你發現這一支已經不可能滿足題意了,就不用再進行下一層迴圈了,避免不必要的計算。

這是剪枝。你甚至可以依據題意調整迴圈變數的取值範圍。

然而剪枝不能改變你演算法的時間複雜度。剪枝只能將計算量減少某個常數倍(不過好的剪枝能讓計算量減少得非常可觀)。

說了這麼多,我想表達的是,想縮減迴圈次數,關鍵在於你要有乙個不需要那麼多次迴圈的演算法。優化演算法可能會用到各種數理知識,所以這其實是你的個人能力問題。

多加練習,你的思維會有很大提公升的。

玩lol如何減少犯病的次數

蒼浪追思 沒有別的辦法,只能是多打,一天打個十多把二十把,你的心態才會從娛樂裡面退出來,轉變為競技心態。只要你還抱著娛樂的想法,幾乎是沒辦法避免犯病的。 leson 深呼吸,不上頭,無時無刻想著秀,才能保持注意力高度集中,最重要的是,以最少的代價打出最多的輸出,即例如有位移的英雄在逃跑或追擊的情況下...

辦事如何減少栽跟頭的次數?

王若非 後來想到一種方法。假如要做一件很的事情。比如約人吃飯,就把這件事寫出來然後按照先後順序把裡面涉及的要素列出來。交通工具,飯店選擇。然後分析每種要素出意外的可能性,如果很有可能出bug就想一種可替代預案。比如交通工具打車可能會堵,就想想地鐵路線。飯店可能會排隊時間長就想想其他美味的餐廳。要提前...

玩《英雄聯盟》如何減少被 Gank 次數?

Versa 一推線流 眼和小地圖其他路miss的方面就不多介紹了。搜一搜都有。推線過去就去河道看看,不要做過多的塔下壓制,塔下壓制前提是己方河道有視野,我一般在對面上半野區做足視野才會去壓制吃塔皮。可以去河道看河道蟹,去最近的野怪刷一下,刷他半個乙個的,反正一點點侵蝕 被發現俗話嘛拿人手軟吃人嘴短,...