#include "primes.h"
int primeNumber(int i);
int main(void){
int numPrimes, i;
printf("V2: Primes will be printed\n");
printf("----------------------\n\n");
printf("How many do you want to see? ");
scanf("%d",&numPrimes);
for(i = 1; i <= numPrimes; i++)
printf("%6d: %10d\n", i, primeNumber(i));
return 0;
}
/* Find and return the i'th prime number */
int primeNumber(int i){
int firstPrime = 2, pnum = 1, candidate = firstPrime;
while (pnum < i){
candidate++;
if (is_prime(candidate)) pnum++;
}
return candidate;
}
![]() | There are three different solutions to this exercise. The original one made by Jan Dimon. This one, which from a problem solving point of view is straightforward, but very inefficient. And a better one, which I recommend. |
![]() | for(i = 1; i <= numPrimes; i++)
printf("%6d: %10d\n", i, primeNumber(i));
|
This is a very simple for loop which will print numPrimes. It uses the function primeNumber(i), which calculates prime number i. |
![]() | /* Find and return the i'th prime number */
int primeNumber(int i){
int firstPrime = 2, pnum = 1, candidate = firstPrime;
while (pnum < i){
candidate++;
if (is_prime(candidate)) pnum++;
}
return candidate;
}
|
This is the function which calcultes the i'th prime number. In the while loop we increment pnum each time we encounter a prime number. We use the boolean function is_prime for this purpose. Notice that this function, is_prime, was given to us in the exercise formulation. It is crucial to notice that pnum is only incremented when candidate is a prime number. Therefore we know that candiate is a prime number when the while loop exits. |
![]() | This program is not efficient. We call primeNumber(i) many times. In each call we repeatedly find the first i - 1 prime numbers. To make things even worse, the given boolean function is_prime(x) is also very inefficient either. The alternative solution avoids the repeated computation of prime numbers. |
![]() | A practical remark about compilation of the example. First compile is_prime.c with gcc -c is_prime.c . Then make a header file primes.h. Now compile the dissected program by gcc primes-main.c is_prime.o, where we assume that the program is located in the C source file primes-main.c. |