我必须创建一个代码,在给定的时间间隔内找到素数,而_case.claims(0) = claim
不会有效,为什么会这样?
if (y % j == 0)
答案 0 :(得分:1)
FOR条件j<= (int) sqrt(p[i])
。我会做一个功能
bool isPrime(int n){
int i;
if(n == 2)
return true;
if(n%2 == 0 || n==1 )
return false;
for(i=2; i<=n/2; i++){
if(n%i == 0)
return false;
}
return true;
}
答案 1 :(得分:1)
执行for(j=1 ...
会使所有数字都匹配y % 1
,因此请从2开始。
然后,一旦上述问题得到纠正,您的算法将显示不 prime的数字。
相反,将变量prime
设置为1,并将该数字视为不是素数时将其重置为0。循环显示数字后,如果它仍然被标记为&#39; prime&#39;:
for(i=0; i<br; i++){
y=p[i];
int prime=1; // <===== start telling it's a prime
for(j=2; j<= (int) sqrt(p[i]); j++){ // <=== start from 2
if(y%j == 0){
prime = 0; // <==== Not a prime
break;
}
}
if (prime) { // <=== after the loop, still a prime
brojac++;
printf("\n%d", y);
}
}
最后,您可能需要遵循您问题下方评论中的建议。
答案 2 :(得分:0)
代码问题:
轻微:scanf("%d %d", &a, &b);
不检查失败。
br=0,... int p[b-a]; for(i=a; i<=b; i++){ p[br]=i; br++;
将有效地尝试访问1次p[]
。
for(j=1; ... if(y%j == 0){
- &gt; y%1 == 0
永远是真的。
j<= (int) sqrt(p[i]);
是一项糟糕的测试,因为sqrt()
价格昂贵,而弱sqrt()
可能会返回一个低于预期整数的值。
if(y%j == 0){ printf("\n%d", p[i]);
打印不是素数的数字。
for(j=1;
循环中的逻辑错误,因为该循环消除了候选素数,不应该打印任何内容。
问题太多了。
相反,请使用快速Sieve of Eratosthenes
#include <stdbool.h>
#include <stdio.h>
void Sieve_of_Eratosthenes(int a, int b) {
printf("Primes from %d to %d\n", a, b);
bool prime[b+1];
for (int i = 2; i<=b; i++) {
prime[i] = true;
}
for (int i = 2; i<=b; i++) {
if (prime[i]) {
for (int j = i+i; j <= b; j += i) {
prime[j] = false;
}
}
}
for (int i = a;i<=b; i++) {
if (prime[i]) printf("%d\n", i);
}
}
int main(void) {
Sieve_of_Eratosthenes(7,50);
}
输出
Primes from 7 to 50
7
11
13
17
19
23
29
31
37
41
43
47