c++ - 素数计算器C++

标签 c++ loops primes nested-loops break

我一直在尝试编写一个程序来打印出不超过值 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;

最佳答案

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

假设输入是 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 << " ";
        }
    }   
}

关于c++ - 素数计算器C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26028523/

相关文章:

c++ - 为什么内联未命名的命名空间?

java - 使用循环和 if 语句从方法返回时出错

loops - 如何实现serialEvent和loop同时不中断?

primes - 如何在 Perl 6 中有效地生成素数列表?

c++ - 是否可以同时使用 GUI 和 3D 图形库创建应用程序?

c++ - 如何迭代/计数 multimap<string,string>

java - 给定一个数字 n ,我们必须找出小于或等于 n 且恰好有 3 个约数的数字

python - Python 中大 `n` 的快速素性测试

c++ - 当 C++ 分配器被销毁/复制/move 时,它应该如何处理其分配的内存?

java - 使用图形界面(按钮)停止java中的循环