#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;
}
}
抱歉发布了错误的代码!
当我跑步时,没有任何反应..有人可以告诉我我做错了吗?
答案 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
,并且在循环完成后不要忘记返回true
或1
而不返回
原始答案:
首先,你需要
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
。用铅笔和纸张完成第一次迭代,看看会发生什么。