使用C查找素数不起作用

时间:2019-01-06 14:01:27

标签: c

我目前正在学习C并试图解决问题。我需要使用数组和循环来查找2到100之间的所有素数。

我已经知道解决此问题的方法,但是我在查找代码错误时遇到了麻烦。这是我第一次使用StackOverflow,所以希望我对所有内容进行了正确的评论:)

#include <stdio.h>
#include <stdlib.h>

int main(){

  int prime_numbers[50] = {2,3};                //initializes the array which will be printed at the end
  int counter = 1;                              //initializes the index of the last prime element in array
  int checker = 0;                              //initializes a checker used to determine if the number is prime

  for(int i = 5; i <= 100; i++) {               //goes through numbers 5 to 100 as the first two primes are hard coded
    for(int j = 0; j <= counter; j++){          //goes through array untill it reaches last prime using the before initialized counter
        if(i % prime_numbers[j] != 0) {         //check to see if a number that is being checked is not divisible by j'th element in array
            checker++;                          //if so, checker is incremented
        }
        if(checker == counter + 1) {            //check to see if number was not divisible by any prime in our array
            checker = 0;                        //if so checker is reset to 0 for the next iteration
            ++counter;                          //counter is incremented as there is one more prime in our array
            prime_numbers[counter] = i;         //add inside array the found prime number
            break;                              //break should not be necessary, however for some reason, it yields a different result when I don't put it in
        }                                       //most likely the error in the code. Need to find out why loop does not stop after second if is done
    }
  }

  for(int g = 0; g <= 50; g++) {                //prints out all the prime numbers in array
    if(prime_numbers[g] != 0) {
        printf("%d ", prime_numbers[g]);
    }
  }

  return 0;
}

我希望程序打印所有从0到100的质数,之间要有空格。

2 个答案:

答案 0 :(得分:0)

程序还会查找非质数。它的逻辑是一个相当奇怪的反转。候选对象仅需被数组中的一个素数整除。报告还打破了数组界限。

更正的代码:

#include <stdio.h>

int main(void) {                            // correct function signature

    int prime_numbers[50] = {2,3};
    int counter = 1;
    int checker;                            // initialise within each loop

    for(int i = 5; i <= 100; i++){
        checker = 0;                        // inintialise here
        for(int j = 0; j <= counter; j++) {
            if(i % prime_numbers[j] == 0) { // opposite test to yours
                checker++;                  // flag a non-prime
                break;
            }
        }

        if(checker == 0) {                  // moved outside the loop
            ++counter;
            prime_numbers[counter] = i;
        }
    }

    for(int g = 0; g < 50; g++) {           // corrected the bounds error
        if(prime_numbers[g] != 0){
            printf("%d ", prime_numbers[g]);
        }
    }
    printf("\n");                           // flush the output buffer
    return 0;
}

程序输出:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

报告循环依赖于初始化为0的数组,并且更好的方法是

for(int j = 0; j <= counter; j++) {
    printf("%d ", prime_numbers[j]);
}
printf("\n");

答案 1 :(得分:0)

以下代码效果很好。

int main()
{
    int k=1,temp,j;
    const int N_prime = 10000;       // number of primes to be generated
    int primes[N_prime];             // array to save primes
    primes[0] = 2;
    primes[1] = 3;
    temp = 5;
    while (k!=N_prime-1){     // generating only N_prime prime numbers
        for (j = 0; j <= k && primes[j] * primes[j] <= temp; j++){
            if (temp%primes[j] == 0){    // if temp%primes[j] == 0 then temp is divisible by
                temp += 2;               // a prime and is not a prime itself, therefore 
                break;                   // immediately break
            }
            else if (primes[j+1] * primes[j+1]>temp){             // if no such primes found, temp is prime,
                primes[k + 1] = temp;                             // save it and increase the value for
                k++;                                              // next check
                temp += 2;
            }
        }
    }
    for (int ind = 0; ind < N_prime; ind++) printf("%d\n",primes[ind]);
    getch();
    return 0;
}

输出:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541

正如我注意到的那样,您的代码会生成所有最大为100的奇数。