diff options
author | rsc <devnull@localhost> | 2003-11-23 18:04:47 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-11-23 18:04:47 +0000 |
commit | bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d (patch) | |
tree | 8ca0fe4e2418e6aa18dc74a236c577a719f6c6ed /src/cmd/factor.c | |
parent | f08fdedcee12c06e3ce9ac9bec363915978e8289 (diff) | |
download | plan9port-bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d.tar.gz plan9port-bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d.tar.bz2 plan9port-bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d.zip |
new utilities.
the .C files compile but are renamed to avoid building automatically.
Diffstat (limited to 'src/cmd/factor.c')
-rw-r--r-- | src/cmd/factor.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/cmd/factor.c b/src/cmd/factor.c new file mode 100644 index 00000000..0232d4e5 --- /dev/null +++ b/src/cmd/factor.c @@ -0,0 +1,96 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +#define whsiz (sizeof(wheel)/sizeof(wheel[0])) + +double wheel[] = +{ + 2,10, 2, 4, 2, 4, 6, 2, 6, 4, + 2, 4, 6, 6, 2, 6, 4, 2, 6, 4, + 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, + 6, 2, 4, 6, 2, 6, 6, 4, 2, 4, + 6, 2, 6, 4, 2, 4, 2,10, +}; + +Biobuf bin; + +void factor(double); + +void +main(int argc, char *argv[]) +{ + double n; + int i; + char *l; + + if(argc > 1) { + for(i=1; i<argc; i++) { + n = atof(argv[i]); + factor(n); + } + exits(0); + } + + Binit(&bin, 0, OREAD); + for(;;) { + l = Brdline(&bin, '\n'); + if(l == 0) + break; + n = atof(l); + if(n <= 0) + break; + factor(n); + } + exits(0); +} + +void +factor(double n) +{ + double quot, d, s; + int i; + + print("%.0f\n", n); + if(n == 0) + return; + s = sqrt(n) + 1; + while(modf(n/2, ") == 0) { + print(" 2\n"); + n = quot; + s = sqrt(n) + 1; + } + while(modf(n/3, ") == 0) { + print(" 3\n"); + n = quot; + s = sqrt(n) + 1; + } + while(modf(n/5, ") == 0) { + print(" 5\n"); + n = quot; + s = sqrt(n) + 1; + } + while(modf(n/7, ") == 0) { + print(" 7\n"); + n = quot; + s = sqrt(n) + 1; + } + d = 1; + for(i=1;;) { + d += wheel[i]; + while(modf(n/d, ") == 0) { + print(" %.0f\n", d); + n = quot; + s = sqrt(n) + 1; + } + i++; + if(i >= whsiz) { + i = 0; + if(d > s) + break; + } + } + if(n > 1) + print(" %.0f\n",n); + print("\n"); +} |