summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/ifactor.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/ifactor.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/ifactor.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/ifactor.c b/reference/C/CONTRIB/SNIP/ifactor.c
new file mode 100755
index 0000000..900c57a
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/ifactor.c
@@ -0,0 +1,66 @@
+/*
+** ifactor.c -- print prime factorization of a number
+**
+** Ray Gardner -- 1985 -- public domain
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int prevfact = 0;
+void factor (long);
+void show (long, int);
+
+void main (int argc, char *argv[])
+{
+ while ( --argc )
+ factor(atol(*++argv));
+}
+
+void factor (long n)
+{
+ long d;
+ int k;
+ long n0 = n;
+ prevfact = 0;
+
+ printf("%ld ",n);
+ if ( n < 2 )
+ {
+ printf("is less than 2.\n");
+ return;
+ }
+ else if ( n > 2 )
+ {
+ d = 2;
+ for ( k = 0; n % d == 0; k++ )
+ n /= d;
+ if ( k )
+ show(d,k);
+ for ( d = 3; d * d <= n; d += 2 )
+ {
+ for ( k = 0; n % d == 0; k++ )
+ n /= d;
+ if ( k )
+ show(d,k);
+ }
+ }
+ if ( n > 1 )
+ {
+ if ( n == n0 )
+ printf(" is prime");
+ else show(n,1);
+ }
+ printf("\n");
+}
+
+void show (long d, int k)
+{
+ if ( prevfact )
+ printf(" * ");
+ else printf(" = ");
+ prevfact++;
+ printf("%ld",d);
+ if ( k > 1 )
+ printf("^%d",k);
+}