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

时间:2011-09-21 19:22:26

标签: 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;
      }
}

抱歉发布了错误的代码!

当我跑步时,没有任何反应..有人可以告诉我我做错了吗?

4 个答案:

答案 0 :(得分:7)

问题完全改变后的含义:

你的CheckIfPrime是错的。你以一种非常奇怪的方式检查可分性。检查a是否可被b整除的一般方法是if(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)

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

一些风格说明:理想情况下,您的函数应该返回bool而不是int,并且在循环完成后不要忘记返回true1而不返回

原始答案:

首先,你需要

fprintf(OUTPUT_FILE, "%d", Num); //d instead of s, no & before Num

而不是

fprintf(OUTPUT_FILE, "%s", &Num); 

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

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

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

答案 1 :(得分:2)

你没有错误检查你的任何FileIO - 想知道那里出了什么问题。一些ifs可以帮助解决这个问题。除此之外,我所看到的只是一个应用程序,如果它正常工作,它将真正快速填充你的硬盘。

答案 2 :(得分:1)

你的主要发电机不工作的主要原因,我可以看到:

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

你开始检查1.由于每个数字/ 1 ==本身,每个数字* 1 ==本身,条件在第一次运行时总是为真;也就是说,您的主要测试将始终返回false。从2开始。

一旦你解决了这个问题,你也应该做到这一点,如果它设法完全通过循环,测试将返回true。 (在循环之后插入return 1;就足够了。)

(顺便说一句,如果你对效率一点关注,if ((num & 1) == 0) return 0; for (int i = 3; i * i <= num; i += 2)会更好。但更好的还是某种筛子,如其他地方所述。)

答案 3 :(得分:0)

int checkIfPrime(int num) {
    for (int i = 1; i < num; i++) {
        int result = num / i;
        if (num == result * i) {
                return 0;
        }
    }
}
  • 在循环结束时遗失return 1
  • i的初始值不得为1。用铅笔和纸张完成第一次迭代,看看会发生什么。