C++素数生成器不起作用

yan*_*s96 -1 c++

#include <iostream>
using namespace std;

int checkIfPrime(int num) {
    for (int i = 1; i < num; i++) {
        int result = num / i;
        if (num == result * i) {
                return 0;
        }
    }
}


int main() {
    int i = 3;
    while(1) {  
             int c = checkIfPrime(i);
             if (c != 0) {
                cout << c << "\n";
             }
             i = i + 2;
      }
}
Run Code Online (Sandbox Code Playgroud)

抱歉发布了错误的代码!

当我运行这个时,没有任何反应..有人能告诉我我做错了什么吗?

Arm*_*yan 7

在问题完全改变了它的含义之后:

CheckIfPrime错了.你以一种非常奇怪的方式检查可分性.检查是否可a被整除的一般方法bif(a % b == 0)

也就是说,你的错误是你的循环以1开始.当然,每个数字都可以被1整除,因此根据你的逻辑,没有数字是素数.从开始for(int i = 2; ....(根据您是否要将1视为素数,您可能希望num == 1最初专门测试.)

而且,结束条件非常低效.在num的平方根之前检查就足够了,也就是说i <= sqrt(num),因为sqrt是一个相当慢而且不精确的操作,所以更好的方法是循环:

 for(int i  = 2; i * i < = num; ++i)
Run Code Online (Sandbox Code Playgroud)

另一个注意事项 - 要生成从1到某个MAX_VAL的所有素数,您的方法效率非常低.使用ErastothenesSieve.

一些风格的注意事项:你的函数理想情况下应该返回boolint不是忘记返回,true或者1在循环完成后不返回.

原答案:

首先,你需要

fprintf(OUTPUT_FILE, "%d", Num); //d instead of s, no & before Num
Run Code Online (Sandbox Code Playgroud)

代替

fprintf(OUTPUT_FILE, "%s", &Num); 
Run Code Online (Sandbox Code Playgroud)

其次,您使用文件I/O非常低效.为什么要为每个号码打开和关闭文件?您应该打开一次,写下所有数字,然后关闭它.

第三,你的算法似乎与素数没有任何关系...... :)

顺便说一下,由于第一个问题导致了Undefined Behavior,你不能抱怨程序的任何行为,因为它是......好吧,未定义.