ホームページ > バックエンド開発 > C++ > 私の素数検索プログラムが何も出力を生成しないのはなぜですか?どうすれば最適化できますか?

私の素数検索プログラムが何も出力を生成しないのはなぜですか?どうすれば最適化できますか?

Mary-Kate Olsen
リリース: 2025-01-13 22:02:45
オリジナル
868 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート