Mercurial > hg > toybox
changeset 1410:ee0109c35b34 draft
Add factor.
I was reading http://www.muppetlabs.com/~breadbox/txt/rsa.html and it mentioned
"factor" and I noticed it was in coreutils. I'm not sure why it's in coreutils,
but it's pretty trivial, so...
author | Rob Landley <rob@landley.net> |
---|---|
date | Fri, 01 Aug 2014 09:08:00 -0500 |
parents | f477dc852d3b |
children | dd336488a69b |
files | scripts/test/factor.test toys/other/factor.c |
diffstat | 2 files changed, 95 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/test/factor.test Fri Aug 01 09:08:00 2014 -0500 @@ -0,0 +1,18 @@ +#!/bin/bash + +[ -f testing.sh ] && . testing.sh + +#testing "name" "command" "result" "infile" "stdin" + +testing "factor -32" "factor -32" "-32: -1 2 2 2 2 2\n" "" "" +testing "factor 0" "factor 0" "0: 0\n" "" "" +testing "factor 1" "factor 1" "1: 1\n" "" "" +testing "factor 2" "factor 2" "2: 2\n" "" "" +testing "factor 3" "factor 3" "3: 3\n" "" "" +testing "factor 4" "factor 4" "4: 2 2\n" "" "" +testing "factor 10000000017" "factor 10000000017" \ + "10000000017: 3 3 3 7 7 7 1079797\n" "" "" +testing "factor 10000000018" "factor 10000000018" \ + "10000000018: 2 131 521 73259\n" "" "" +testing "factor 10000000019" "factor 10000000019" \ + "10000000019: 10000000019\n" "" ""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toys/other/factor.c Fri Aug 01 09:08:00 2014 -0500 @@ -0,0 +1,77 @@ +/* factor.c - Factor integers + * + * Copyright 2014 Rob Landley <rob@landley.net> + * + * No standard, but it's in coreutils + +USE_FACTOR(NEWTOY(factor, 0, TOYFLAG_USR|TOYFLAG_BIN)) + +config FACTOR + bool "factor" + default y + help + usage: factor NUMBER... + + Factor integers. +*/ + +#include "toys.h" + +static void factor(char *s) +{ + long l, ll; + + l = strtol(s, &s, 0); + if (*s) { + error_msg("%s: not integer"); + return; + } + + printf("%ld:", l); + + // Negative numbers have -1 as a factor + if (l < 0) { + printf(" -1"); + l *= -1; + } + + // Deal with 0 and 1 (and 2 since we're here) + if (l < 3) { + printf(" %ld\n", l); + return; + } + + // Special case factors of 2 + while (l && !(l&1)) { + printf(" 2"); + l >>= 1; + } + + // test odd numbers. + for (ll=3; ;ll += 2) { + if (ll*ll>l) { + if (l>1) printf(" %ld", l); + break; + } + while (!(l%ll)) { + printf(" %ld", ll); + l /= ll; + } + } + xputc('\n'); +} + +void factor_main(void) +{ + if (toys.optc) { + char **ss; + + for (ss = toys.optargs; *ss; ss++) factor(*ss); + } else for (;;) { + char *s = 0; + size_t len = 0; + + if (-1 == getline(&s, &len, stdin)) break; + factor(s); + } +}