我有这个代码用于素数..它给了我最高达103的素数。也许我的第一个断言是错的?我是这样做的,因为我想跳过尽可能多的数字。我只想要至少有两位数的素数(这就是为什么我从11开始)
#include <stdio.h>
#define MAXNUMB 100000000
int main (void)
{
int i, j;
for (i = 11 ; i < MAXNUMB ; i += 2)
{
if ((i % 3 == 0) && (i % 5 == 0) && (i % 7 == 0))
break;
for (j = 3 ; j * j <= i ; j += 2)
{
if (i % j == 0)
break;
}
if (j * j > i)
printf ("%d \n", i);
}
}
答案 0 :(得分:4)
使用continue
而不是break
;在这里你想要跳过很多数字(好像有许多方法可以找到像复杂程度很小的Sieve of Eratosthenes这样的小数字素数),但它会中断。所以改变一点..
if((i%3==0)&& ( i%5==0) && (i%7==0))
continue;// here
它有效..
答案 1 :(得分:0)
使用调试器显而易见,该语句是错误的。首先,检查可被3 和 5 和 7整除的数字.105可被全部整除。然后你打破,这意味着“退出这个for循环”,所以程序将结束。您需要继续循环,而不是将此数字报告为素数。
您想要将循环更改为使用或而不是和。此外,下一个for循环不需要从3开始,因为你已经尝试了3,5,7。但是有没有理由,因为你可以只使用for循环?
我的建议是完全忘记第一个,因为它不会让它更快。
答案 2 :(得分:0)
#include <stdio.h>
#define MAXNUMB 100000000
int main (void)
{
int i, j, f;
for (i = 11; i < MAXNUMB; i += 2)
{
for (j = 2, f = 1; f && j * j < i; ++j)
{
f = (i % j != 0);
}
if (f) printf("%d\n", i);
}
return 0;
}
答案 3 :(得分:0)
#include <stdio.h>
#include <string.h>
#define MAXNUMB 100000000
int main (void)
{
int i, j, P[MAXNUMB];
memset(P, 0, sizeof(P));
for(i = 2; i < MAXNUMB; ++i)
{
if(P[i] == 0){
printf("%d\n", i);
if(i < MAXNUMB / i)
for(j = i*i; j < MAXNUMB; j += i)
P[j] = 1;
}
}
return 0;
}