넓은 범위의 소수 프로그램 디버깅
한 프로그래머가 크고 긴 변수 범위 내에서 소수를 식별하도록 설계된 프로그램의 문제를 해결하고 있습니다. 프로그램은 오류 없이 실행되지만 출력은 생성되지 않습니다. 문제가 있는 코드는 다음과 같습니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!