Computer Programming Contest Preparation

ToolBox - Source for: 1/136/fd.c



/home/toolbox/public_html/solutions/1/136/fd.c
    1 #include <stdio.h>
    2 #include <string.h>
    3 #include <sys/types.h>
    4 #include <sys/stat.h>
    5 #include <fcntl.h>
    6 #include <stdint.h>
    7 #include <math.h>
    8 #include <stdlib.h>
    9 
   10 #define TRUE  (1 == 1)
   11 #define FALSE (1 != 1)
   12 
   13 #define DEBUG if (TRUE)
   14 
   15 
   16 /*
   17  *  Author: Isaac Traxler
   18  *    Date: 2022-02-25
   19  * Purpose: fun
   20  * Problem: 136 - Ugly Numbers
   21  */
   22 
   23 /*
   24  * This template reads data until a terminating value is reached.
   25  */
   26 
   27 /*              2147483648 */
   28 #define UPPER    865000000
   29 #define MAX 2147483647
   30 
   31 int sieve[2*UPPER];
   32 
   33 void init()
   34 {
   35     /* FUNCTION init */
   36     int i;
   37     int j;
   38     int k;
   39     int ti;
   40     int tj;
   41     int tij;
   42     int ij;
   43     int tmp = 0;
   44     int cnt = 0;
   45 
   46     sieve[1] = 1;
   47     printf("starting setup\n");
   48     for (i=7; UPPER>i; i++)
   49         {
   50             sieve[i] = 0;
   51         }
   52     for (i=2; UPPER>i; i=i*2)
   53         {
   54             /* do all powers of 2 */
   55             sieve[i] = 1;
   56             printf("sieve[%d] set: %d %d %d\n", i, i, 0, 0);
   57             ti = ((UPPER + i - 1) / i);
   58             for (j=3; UPPER>j; j=j*3)
   59                 {
   60                     /* do all powers of 3 */
   61                     sieve[j] = 1;
   62                     printf("sieve[%d] set: %d %d %d\n", j, 0, j, 0);
   63                     if (ti >= j)
   64                         {
   65                             ij = i * j;
   66                             sieve[ij] = 1;
   67                             printf("sieve[%d] set: %d %d %d\n", ij, i, j, 0);
   68                         }
   69                     tj = ((UPPER + j - 1) / j);
   70                     for (k=5; UPPER>k; k=k*5)
   71                         {
   72                             /* do all powers of 5 */
   73                             cnt++;
   74                             printf("ijk %d %d %d\n", i, j, k);
   75                             sieve[k] = 1;
   76                             printf("sieve[%d] set: %d %d %d\n", k, 0, 0, k);
   77                             if (ti >= k)
   78                                 {
   79                                     sieve[i*k] = 1;
   80                                     printf("sieve[%d] set: %d %d %d\n", i*k, i, 0, k);
   81                                 }
   82                             if (tj >= k)
   83                                 {
   84                                     sieve[j*k] = 1;
   85                                     printf("sieve[%d] set: %d %d %d\n", j*k, 0, j, k);
   86                                 }
   87                             tij = (((UPPER + i -1) / i) +j - 1) / j;
   88                             if (tij >= k)
   89                                 {
   90                                     sieve[ij*k] = 1;
   91                                     printf("sieve[%d] set: %d %d %d (ij %d) (tij %d)\n", i*j*k, i, j, k, ij, tij);
   92                                 }
   93                             if ((0 == tmp) && (1 == sieve[292986880]))
   94                                 {
   95                                     tmp = 1;
   96                                     printf("XX 292986880 (cnt %d)  (i %d) (j %d) (k %d)\n", cnt, i, j, k);
   97                                 }
   98                             if ((1 == tmp) && (1 == sieve[585973760]))
   99                                 {
  100                                     tmp = 2;
  101                                     printf("XY 585973760  (cnt %d) (i %d) (j %d) (k %d)\n", cnt, i, j, k);
  102                                 }
  103                         } /* do all powers of 5 */
  104                 } /* do all powers of 3 */
  105         } /* do all powers of 2 */
  106 } /* FUNCTION init */
  107 
  108 void process()
  109 {
  110     /* FUNCTION process */
  111     int i;
  112     int cnt;
  113 
  114     for (i=1,cnt=0; cnt<=1500; i++)
  115         {
  116             /* look for non-zero values */
  117             if (0 != sieve[i])
  118                 {
  119                     cnt++;
  120                     printf("(%d) sieve[%d] = %d\n", cnt, i, sieve[i]);
  121                 }
  122         } /* look for non-zero values */
  123 
  124     printf("%d\n", sieve[i]);
  125 } /* FUNCTION process */
  126 
  127 int main ()
  128 {
  129     /* main */
  130     init();
  131     process();
  132     return EXIT_SUCCESS;
  133 } /* main */
  134