-1

This is my code for finding 10000th prime number but it is really slow, it takes 7 seconds to calculate.

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

long int prime (int n)
{
    int i;
    for(i=2;i<n;i++)
    {
        if(n%i==0)
        return 0;
    }
    return 1;
}

int main()
{
    int i=2,counter=0;
    while(1)
    {
        if(prime(i))
        counter++;
        if(counter==10000)
        break;
        i++;
    }
    printf("10000th prime number is: %d",i);
}

It is brute force method so that's probably reason why it's so slow. I think problem may be that it has to call function so many times. So what do you think can it be optimised or it's better to find some math formula for this.

plumber
  • 23
  • 3

3 Answers3

0

To optimized your code a little bit (changes are made based on comments):

long int prime (int n)
{
  int i;
  int e = (int)sqrt(n);
  for(i=2; i<=e;i++)
  {
    if(n%i==0)
    return 0;
  }
  return 1;
}
Kaizhe Huang
  • 930
  • 5
  • 11
0

You can reduce the time substantially by making the following changes to prime():

  1. Stopping at sqrt(n).
  2. Starting at i=3, and incrementing i by 2.

Here's a program that contains both versions and the time taken by each.

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

int is_prime1 (int n)
{
    int i;
    for(i=2;i<n;i++)
    {
        if(n%i==0)
        return 0;
    }
    return 1;
}

void do_it1(int max)
{
   clock_t start = clock();
   clock_t end;

   int i=2,counter=0;
   while(1)
   {
      if(is_prime1(i))
         counter++;
      if(counter==max)
         break;
      i++;
   }
   end = clock();

   printf("%dth prime number is: %d\n", max, i);
   printf("Time taken: %lf\n", 1.0*(end-start)/CLOCKS_PER_SEC);
}

int is_prime2 (int n)
{
    int i;
    int stop = sqrt(n);
    for(i=3;i<=stop;i+=2)
    {
        if(n%i==0)
        return 0;
    }
    return 1;
}

void do_it2(int max)
{
   clock_t start = clock();
   clock_t end;

   int i=3,counter=1;
   while(1)
   {
      if(is_prime2(i))
         counter++;
      if(counter==max)
         break;
      i += 2;
   }
   end = clock();

   printf("%dth prime number is: %d\n", max, i);
   printf("Time taken: %lf\n", 1.0*(end-start)/CLOCKS_PER_SEC);
}

int main(int argc, char** argv)
{
   int max = atoi(argv[1]);
   do_it1(max);
   do_it2(max);
}

Sample execution:

./test 10000

Sample output:

10000th prime number is: 104729
Time taken: 9.469000
10000th prime number is: 104729
Time taken: 0.078000
R Sahu
  • 196,807
  • 13
  • 136
  • 247
-1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int *prime;
int prime_n;

void make_prime_table(int n){
    prime = malloc(sizeof(int) * n / 2);
    prime_n =0;
    prime[prime_n++] = 2;
    prime[prime_n++] = 3;
    int i, j;
    for(i = 5; i <= n; i +=2){
        bool is_prime = true;
        for(j = 1; j < prime_n ; ++j){
            int t = prime[j];
            if(t * t > i)
                break;
            if(i % t == 0){
                is_prime = false;
                break;
            }
        }
        if(is_prime)
            prime[prime_n++] = i;
    }
}

int main(void){
    int n = 105000;
    make_prime_table(n);
    if(prime_n >= 10000)
        printf("10000th prime number is: %d\n", prime[9999]);

    free(prime);
    return 0;
}
BLUEPIXY
  • 38,201
  • 6
  • 29
  • 68