summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/factor.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/factor.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/factor.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/factor.c b/reference/C/CONTRIB/SNIP/factor.c
new file mode 100755
index 0000000..4b35d4a
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/factor.c
@@ -0,0 +1,80 @@
+/*
+** factor.c -- print prime factorization of a number
+** Ray Gardner -- 1985 -- public domain
+** Modified Feb. 1989 by Thad Smith > public domain
+**
+** This version takes numbers up to the limits of double precision.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+int prevfact = 0;
+void factor (double);
+void show (double, int);
+
+void main (int argc, char *argv[])
+{
+ while ( --argc )
+ factor(atof(*++argv));
+}
+
+void factor (double n)
+{
+ double d;
+ int k;
+
+ prevfact = 0;
+
+ d = n+1; /* test for roundoff error */
+ if (n+3 != d+2)
+ {
+ printf("%0.0f is too large to process.\n", n);
+ return;
+ }
+ if (fmod(n,1.) != 0.0)
+ {
+ printf("%f is not an integer.\n",n);
+ return;
+ }
+ printf("%0.0f ",n);
+ if ( n < 2. )
+ {
+ printf("is less than 2.\n");
+ return;
+ }
+ else if ( n > 2. )
+ {
+ d = 2;
+ for ( k = 0; fmod(n,d) == 0.0; k++ )
+ n /= d;
+ if ( k )
+ show(d,k);
+ for ( d = 3; d * d <= n; d += 2 )
+ {
+ for ( k = 0; fmod(n,d) == 0.0; k++ )
+ n /= d;
+ if ( k )
+ show(d,k);
+ }
+ }
+ if ( n > 1 )
+ {
+ if ( ! prevfact )
+ printf(" is prime");
+ else show(n,1);
+ }
+ printf("\n");
+}
+
+void show (double d, int k)
+{
+ if ( prevfact )
+ printf(" * ");
+ else printf(" = ");
+ prevfact++;
+ printf("%0.0f",d);
+ if ( k > 1 )
+ printf("^%d",k);
+}