From 199d363b79e769bf8dc150bf37228395bfbb4d16 Mon Sep 17 00:00:00 2001 From: boblied Date: Fri, 5 Mar 2021 06:47:55 -0600 Subject: PWC 102 Task 1, Rare Numbers, in C --- challenge-102/bob-lied/c/ch-1.c | 82 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 challenge-102/bob-lied/c/ch-1.c 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 +#include +#include + +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); +} -- cgit