调试大范围素数程序
一名程序员正在对一个旨在识别大而长的变量范围内的素数的程序进行故障排除。程序运行没有错误,但不产生任何输出。 这是有问题的代码:
<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中文网其他相关文章!