Advertisement
ijontichy

findprimes.c

Oct 20th, 2012
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.68 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <stdint.h>
  5. #include <string.h>
  6.  
  7. #define ARGLEN  10
  8. #define true    1
  9. #define false   !true
  10.  
  11.  
  12. int main(int argc, char** argv)
  13. {
  14.     uint8_t  notPrime;
  15.     uint32_t count = 0;
  16.     uint64_t start, end, divInt, i;
  17.  
  18.     uint64_t * primes;
  19.  
  20.     long double divFloat, current, currentMax, testPrime;
  21.    
  22.     // ensure null-terminated
  23.     char *startArg = malloc(ARGLEN + 1); memset(startArg, 0, ARGLEN + 1);
  24.     char *lastValid = malloc(ARGLEN + 1); memset(lastValid, 0, ARGLEN + 1);
  25.  
  26.     if (argc <= 1)
  27.     {
  28.         start = 3;
  29.     }
  30.     else
  31.     {
  32.         startArg = (char*)memcpy(startArg, argv[1], ARGLEN * sizeof(char));
  33.         start = (uint64_t)strtoll(startArg, &lastValid, 10);
  34.  
  35.         if (strlen(argv[1]) > ARGLEN)
  36.         {
  37.             printf("warning: starting number truncated\n");
  38.         }
  39.  
  40.         if (strcmp(startArg, lastValid) == 0)
  41.         {
  42.             printf("%s is an invalid number\n", startArg);
  43.             return 1;
  44.         }
  45.     }
  46.  
  47.     if (argc <= 2)
  48.     {
  49.         end = 0xFFFFFFFFFFFFFFFF;
  50.     }
  51.     else
  52.     {
  53.         startArg = (char*)memcpy(startArg, argv[2], ARGLEN * sizeof(char));
  54.         end = (uint64_t)strtoll(startArg, &lastValid, 10);
  55.  
  56.         if (strlen(argv[1]) > ARGLEN)
  57.         {
  58.             printf("warning: starting number truncated\n");
  59.         }
  60.  
  61.         if (strcmp(startArg, lastValid) == 0)
  62.         {
  63.             printf("%s is an invalid number\n", startArg);
  64.             return 1;
  65.         }
  66.     }
  67.  
  68.     if (start >= end)
  69.     {
  70.         printf("The interval [%lu, %lu] is empty, aborting", start, end);
  71.         return 2;
  72.     }
  73.  
  74.     printf("Starting at number \"%lu\", ending at number \"%lu\"\n", start, end);
  75.     current = (long double)start;
  76.     primes = malloc(((end - start) + 1) * sizeof(uint64_t));
  77.  
  78.     primes[0] = 2;
  79.  
  80.     while (1)
  81.     {
  82.         currentMax = sqrtl(current);
  83.         notPrime = false;
  84.  
  85.         for (i = 0; i < count; i++)
  86.         {
  87.             testPrime = primes[i];
  88.  
  89.             if (testPrime > currentMax) { break; }
  90.  
  91.             divFloat = current / testPrime;
  92.             divInt = round(divFloat);
  93.  
  94.             //printf("%-20Lf %Lf %lu\n", i, divFloat, divInt);
  95.  
  96.             if ((long double)divInt == divFloat)
  97.             {
  98.                 notPrime = true;
  99.                 break;
  100.             }
  101.         }
  102.  
  103.         if (!notPrime)
  104.         {
  105.             printf("%lu\n", (uint64_t)current);
  106.             primes[++count] = current;
  107.             /*
  108.             printf("%-12lu", (uint64_t)current);
  109.  
  110.  
  111.             if (!(count & 7))
  112.             {
  113.                 printf("\n");
  114.             }
  115.             */
  116.         }
  117.            
  118.         current++;
  119.  
  120.         if (current >= end) { break; }
  121.     }
  122.     printf("\n");
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement