Thursday, September 22, 2011

Program to find nth Prime number in C

Objective: To print any Prime number in C. 
This task may sound easy but is a very good exercise to help optimize CPU intensive programs. Finding Prime number is a very CPU hogging task and it becomes even more dreaded as the number starts to grow. Lets say we want to find 30001th prime. how will we find it?? Here is the program.

Programming logic: The easiest method is to check if the given number N is divisible by any number from 2 to N-1.
But it may be noted that we don't need to go beyond the number that is square root of N.  why??
lets have a look.
Say we are testing number 49 for prime number. Our objective is to find any number that may divide it. so we start from 2,3,4 etc. As soon as we cross 7 there will be no number that will divide 49, if there was we have got it earlier since it will be smaller then 7.  Get it?
another example 64 :
2x32
4x16
8x8
16x4
32x2
as you can see when we pass number 8 we don't need to test as the number that will come , we have tested them already. (clever right ?)

Code:
#include <stdio.h>
int main()
{
int count=0;
long a = 2;
while(count<30001)
{
    long b = 2;
    int prime = 1;// to check if found a prime
    while(b * b <= a)
    {
        if(a % b == 0)
        {
            prime = 0;
            break;
        }
        b++;
    }
    if(prime)
    count++;
    a++;
}
printf("%d st prime no. : %ld\n",count,--a);
return 0;
}


It may be noted that this program can be further optimized in several ways. One possible way is to consider only odd terms ( since even terms cant be prime, except 2)