【问题标题】:Prime number calculator C++素数计算器 C++
【发布时间】:2014-09-25 00:16:17
【问题描述】:

我一直在尝试编写一个程序来打印出最高值为 N 的素数。

运行程序时,提示我按预期输入值N,但是当我按回车时,程序结束。我认为问题可能在于break语句:

if (modulo == 0) break;

尽管读到“break”只会结束嵌套循环而不是两者,但我认为它是唯一可能出错的地方。当我将其替换为“继续”时,程序会打印出从 N 到 0 的所有整数,因此如果我输入 N=20,则输出为 20、19、18、... 3、2、

代码的相关部分如下,对于 C++ 新手的任何帮助/建议将不胜感激。

int N, f;
float modulo;

cout << "Welcome to the prime number sieve\n";
cout << "Enter the number up to which the prime numbers will be printed: ";
cin >> N;

for (int j = N; j != 1; j--) {              
    f = j;

    for (f; f != 0; f--) {
       modulo = j%f;
        if (f == 1) {
            cout << j << ", ";
        }   
        if (modulo == 0) break;
        }                                         

}

  return 0;

【问题讨论】:

  • 尝试单步调试代码(用笔和纸手动或在调试器的帮助下)。这应该可以帮助您弄清楚这里实际发生了什么(特别是查看modulo 的值,因为它是在内部循环中计算出来的)。
  • 感谢您抽出时间 SleuthEye,我会再试试看。

标签: c++ loops primes nested-loops break


【解决方案1】:

你的算法是错误的。无论数字是多少,第二个循环的中断都会立即发生。

假设输入是20。那么

第一次迭代:

j = 20
f = j = 20
modulo = 20 % 20 = 0
break

第二次迭代:

j = 19
f = j = 19
modulo = 19 % 19 = 0
break

等等...您应该首先查找Sieve of Eratosthenes

对于你的程序,这个怎么样 (Explanation):

for (int j=2; j < N; j++) {
    for (int f = 2; f*f <= j; f++) {
        if (j % f == 0) {
            break;
        }
        else if (f+1 > sqrt(j)) {
            cout << j << " ";
        }
    }   
}

【讨论】:

  • 我认为这是有道理的,这是我的愚蠢错误。非常感谢你!
  • @Tom 我们都会犯错我的朋友 :) 总是在你的脑海中调试你的代码,如果这不起作用,在调试器中。断点可以创造奇迹:)
猜你喜欢
  • 2013-04-22
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2014-06-29
  • 2011-02-20
相关资源
最近更新 更多