aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorboblied <boblied@gmail.com>2021-03-05 06:47:55 -0600
committerboblied <boblied@gmail.com>2021-03-05 06:47:55 -0600
commit199d363b79e769bf8dc150bf37228395bfbb4d16 (patch)
tree8374eb23065d0ca9a92035d8cf1dde4c6eab939c
parent1a5ee1eb5296a02265f7c83b177f50a4761e01b8 (diff)
downloadperlweeklychallenge-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.c82
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);
+}