首頁 >後端開發 >C++ >為什麼我的素數查找程式沒有產生任何輸出,我該如何優化它?

為什麼我的素數查找程式沒有產生任何輸出,我該如何優化它?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-13 22:02:45868瀏覽

Why Isn't My Prime Number Finding Program Producing Any Output, and How Can I Optimize It?

調試大範圍素數程式

一名程式設計師正在對一個旨在識別大而長的變數範圍內的素數的程式進行故障排除。程式運行沒有錯誤,但不產生任何輸出。 這是有問題的程式碼:

<code class="language-csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication16
{
    class Program
    {
        void prime_num(long num)
        {
            bool isPrime = true;
            for (int i = 0; i < num; i++) // Outer loop starts at 0!
            {
                isPrime = true;
                for (int j = 2; j < i; j++) // Inefficient inner loop
                {
                    if (i % j == 0)
                    {
                        isPrime = false;
                        break;
                    }
                }
                if (isPrime)
                {
                    Console.WriteLine(i);
                }
            }
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.prime_num(100); // Example range
        }
    }
}</code>

核心問題在於巢狀循環的邏輯。外層循環從 i = 0 開始,錯誤地將 0 識別為素數。 此外,內循環的低效率顯著減慢了大範圍內的處理速度。 當它只需要檢查 i-1 的平方根時,它會檢查 i 的整除性。

更有效的方法是利用試分篩法。 雖然使用 LINQ 可以實現單行解決方案,但它的可讀性較差。更實用的最佳化方案如下:

<code class="language-csharp">using System;
using System.Collections.Generic;

public class PrimeFinder
{
    public static List<long> FindPrimes(long limit)
    {
        List<long> primes = new List<long>();
        bool[] isPrime = new bool[limit + 1];
        for (long i = 2; i <= limit; i++)
        {
            isPrime[i] = true;
        }

        for (long p = 2; p * p <= limit; p++)
        {
            if (isPrime[p])
            {
                for (long i = p * p; i <= limit; i += p)
                    isPrime[i] = false;
            }
        }

        for (long i = 2; i <= limit; i++)
        {
            if (isPrime[i])
            {
                primes.Add(i);
            }
        }
        return primes;
    }

    public static void Main(string[] args)
    {
        List<long> primes = FindPrimes(100); // Example range
        foreach(long p in primes)
        {
            Console.WriteLine(p);
        }
    }
}</code>

此修訂後的代碼採用基於埃拉托斯特尼篩法的方法,以在更大的範圍內獲得更好的性能。 它可以正確識別並輸出指定限制內的素數。

以上是為什麼我的素數查找程式沒有產生任何輸出,我該如何優化它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn