diff options
| author | boblied <boblied@gmail.com> | 2021-03-05 06:47:55 -0600 |
|---|---|---|
| committer | boblied <boblied@gmail.com> | 2021-03-05 06:47:55 -0600 |
| commit | 199d363b79e769bf8dc150bf37228395bfbb4d16 (patch) | |
| tree | 8374eb23065d0ca9a92035d8cf1dde4c6eab939c | |
| parent | 1a5ee1eb5296a02265f7c83b177f50a4761e01b8 (diff) | |
| download | perlweeklychallenge-club-199d363b79e769bf8dc150bf37228395bfbb4d16.tar.gz perlweeklychallenge-club-199d363b79e769bf8dc150bf37228395bfbb4d16.tar.bz2 perlweeklychallenge-club-199d363b79e769bf8dc150bf37228395bfbb4d16.zip | |
PWC 102 Task 1, Rare Numbers, in C
| -rw-r--r-- | challenge-102/bob-lied/c/ch-1.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/challenge-102/bob-lied/c/ch-1.c b/challenge-102/bob-lied/c/ch-1.c new file mode 100644 index 0000000000..1ff39d59ec --- /dev/null +++ b/challenge-102/bob-lied/c/ch-1.c @@ -0,0 +1,82 @@ +/* vim:set ts=4 sw=4 sts=4 et ai wm=0 nu syntax=c: */ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +int verbose = 1; + +int mightBeRare[10] = { 1, 0, 1, 1, 0, 1, 0, 1, 1, 0 }; + +int mightBeSquare[10] = { 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 }; + +long +reverse(long r) +{ + long r1 = 0; + while ( r ) + { + r1 = r1 * 10 + r%10; + r /= 10; + } + return r1; +} + + +int +main(int argc, char **argv) +{ + int N; + + N = atoi(argv[1]); + + int isNodd = N % 2; + + long scale = pow(10, (N-1)); + long endOfRange = pow(10, N); + + for ( long r = scale ; r < endOfRange ; r++ ) + { + // Rare numbers can never start with an odd digit. + if ( (r / scale ) % 2 ) + { + r += scale; + } + +// if ( r % 10000000 == 0 ) printf("%ld\n", r); + + if ( ! mightBeRare[ r % 10 ] ) + { + continue; + } + + long r1 = reverse(r); + + long y2 = r - r1; + if ( y2 < 0 ) continue; // Can't be a square + + long x2 = r + r1; + + if ( !( mightBeSquare[ x2%10] && mightBeSquare[ y2%10 ] ) ) continue; + + if ( isNodd ) + { + if ( y2 % 1089 ) continue; + } + else + { + if ( x2 % 121 ) continue; + } + + double x = sqrt(x2); + if ( x != (long)(x) ) continue; + + double y = sqrt(y2); + if ( y != (long)(y) ) continue; + + printf("N=%d R=%ld\n", N, r); + } + + + exit(0); +} |
