3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以使用近似最佳的試驗(yàn)分割篩在一條(長(zhǎng))線上更快地完成此操作,如下所示:
Enumerable.Range(0, Math.Floor(2.52*Math.Sqrt(num)/Math.Log(num))).Aggregate( Enumerable.Range(2, num-1).ToList(), (result, index) => { var bp = result[index]; var sqr = bp * bp; result.RemoveAll(i => i >= sqr && i % bp == 0); return result; });
這里使用的素?cái)?shù)的近似公式是π(x) < 1.26 x / ln(x)
。我們只需要通過(guò)不大于的素?cái)?shù)進(jìn)行測(cè)試x = sqrt(num)
。
請(qǐng)注意,Eratosthenes的篩網(wǎng)比試驗(yàn)分區(qū)具有更好的運(yùn)行時(shí)間復(fù)雜度(num
如果正確實(shí)施,應(yīng)該更快地運(yùn)行更大的值)。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
試試這個(gè):
void prime_num(long num){ // bool isPrime = true; for (long i = 0; i <= num; i++) { bool isPrime = true; // Move initialization to here for (long j = 2; j < i; j++) // you actually only need to check up to sqrt(i) { if (i % j == 0) // you don't need the first condition { isPrime = false; break; } } if (isPrime) { Console.WriteLine ( "Prime:" + i ); } // isPrime = true; }}

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
您只需要檢查奇數(shù)除數(shù),直到數(shù)字的平方根。換句話說(shuō),你的內(nèi)循環(huán)需要開(kāi)始:
for (int j = 3; j <= Math.Sqrt(i); j+=2) { ... }
一旦發(fā)現(xiàn)數(shù)字不是素?cái)?shù),你也可以打破這個(gè)功能,你不需要檢查任何更多的除數(shù)(我看你已經(jīng)這樣做了?。?/p>
這僅在num大于2時(shí)才有效。
沒(méi)有Sqrt
您可以通過(guò)保持運(yùn)行總和來(lái)完全避免Sqrt。例如:
int square_sum=1;for (int j=3; square_sum<i; square_sum+=4*(j++-1)) {...}
這是因?yàn)閿?shù)字1+(3 + 5)+(7 + 9)的總和將給出一系列奇數(shù)正方形(1,9,25等)。因此j
代表了平方根square_sum
。只要square_sum
不到i
那么j
小于平方根。
- 3 回答
- 0 關(guān)注
- 553 瀏覽
添加回答
舉報(bào)