找到c中的素数,我的if不做它的工作

时间:2017-11-21 18:51:41

标签: c

我必须创建一个代码,在给定的时间间隔内找到素数,而_case.claims(0) = claim 不会有效,为什么会这样?

if (y % j == 0)

3 个答案:

答案 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)

代码问题:

  1. 轻微:scanf("%d %d", &a, &b);不检查失败。

  2. br=0,... int p[b-a]; for(i=a; i<=b; i++){ p[br]=i; br++;将有效地尝试访问1次p[]

  3. for(j=1; ... if(y%j == 0){ - &gt; y%1 == 0永远是真的。

  4. j<= (int) sqrt(p[i]);是一项糟糕的测试,因为sqrt()价格昂贵,而弱sqrt()可能会返回一个低于预期整数的值。

  5. if(y%j == 0){ printf("\n%d", p[i]);打印不是素数的数字。

  6. for(j=1;循环中的逻辑错误,因为该循环消除了候选素数,不应该打印任何内容。

  7. 问题太多了。

    相反,请使用快速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