Rumah >pembangunan bahagian belakang >C++ >Mengapa Program Mencari Nombor Perdana Saya Tidak Menghasilkan Sebarang Output, dan Bagaimana Saya Boleh Mengoptimumkannya?

Mengapa Program Mencari Nombor Perdana Saya Tidak Menghasilkan Sebarang Output, dan Bagaimana Saya Boleh Mengoptimumkannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-13 22:02:45868semak imbas

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

Menyahpepijat Program Nombor Perdana dengan Julat Yang Besar

Seorang pengaturcara sedang menyelesaikan masalah program yang direka bentuk untuk mengenal pasti nombor perdana dalam julat pembolehubah yang besar dan panjang. Program ini berjalan tanpa ralat, tetapi tidak menghasilkan output. Inilah kod yang bermasalah:

<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>

Isu teras terletak pada logik gelung bersarang. Gelung luar bermula pada i = 0, salah mengenal pasti 0 sebagai perdana. Tambahan pula, ketidakcekapan gelung dalam memperlahankan proses untuk julat besar dengan ketara. Ia menyemak kebolehbahagi sehingga i-1, apabila ia hanya perlu menyemak sehingga punca kuasa dua i.

Pendekatan yang lebih cekap menggunakan kaedah ayak pembahagian percubaan. Walaupun penyelesaian satu baris boleh dilakukan menggunakan LINQ, ia kurang boleh dibaca. Penyelesaian dioptimumkan yang lebih praktikal ditunjukkan di bawah:

<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>

Kod yang disemak ini menggunakan pendekatan berasaskan Sieve of Eratosthenes untuk prestasi yang lebih baik dengan julat yang lebih besar. Ia mengenal pasti dan mengeluarkan nombor perdana dengan betul dalam had yang ditentukan.

Atas ialah kandungan terperinci Mengapa Program Mencari Nombor Perdana Saya Tidak Menghasilkan Sebarang Output, dan Bagaimana Saya Boleh Mengoptimumkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn