diff options
-rwxr-xr-x | tests/factor.test | 4 | ||||
-rw-r--r-- | toys/other/factor.c | 69 |
2 files changed, 41 insertions, 32 deletions
diff --git a/tests/factor.test b/tests/factor.test index a3e4cbf8..ed1cc226 100755 --- a/tests/factor.test +++ b/tests/factor.test @@ -16,3 +16,7 @@ testing "factor 10000000018" "factor 10000000018" \ "10000000018: 2 131 521 73259\n" "" "" testing "factor 10000000019" "factor 10000000019" \ "10000000019: 10000000019\n" "" "" + +testing "factor 3 6 from stdin" "factor" "3: 3\n6: 2 3\n" "" "3 6" +testing "factor stdin newline" "factor" "3: 3\n6: 2 3\n" "" "3\n6\n" + diff --git a/toys/other/factor.c b/toys/other/factor.c index 9dc1cca8..bf454b44 100644 --- a/toys/other/factor.c +++ b/toys/other/factor.c @@ -21,46 +21,51 @@ static void factor(char *s) { long l, ll; - l = strtol(s, &s, 0); - if (*s) { - error_msg("%s: not integer"); - return; - } - - printf("%ld:", l); + for (;;) { + while(isspace(*s)) s++; + if (!*s) return; - // Negative numbers have -1 as a factor - if (l < 0) { - printf(" -1"); - l *= -1; - } + l = strtol(s, &s, 0); + if (*s && !isspace(*s)) { + error_msg("%s: not integer"); + return; + } - // Deal with 0 and 1 (and 2 since we're here) - if (l < 3) { - printf(" %ld\n", l); - return; - } + printf("%ld:", l); - // Special case factors of 2 - while (l && !(l&1)) { - printf(" 2"); - l >>= 1; - } + // Negative numbers have -1 as a factor + if (l < 0) { + printf(" -1"); + l *= -1; + } - // test odd numbers. - for (ll=3; ;ll += 2) { - long lll = ll*ll; + // Nothing below 4 has factors + if (l < 4) { + printf(" %ld\n", l); + continue; + } - if (lll>l || lll<ll) { - if (l>1) printf(" %ld", l); - break; + // Special case factors of 2 + while (l && !(l&1)) { + printf(" 2"); + l >>= 1; } - while (!(l%ll)) { - printf(" %ld", ll); - l /= ll; + + // test odd numbers. + for (ll=3; ;ll += 2) { + long lll = ll*ll; + + if (lll>l || lll<ll) { + if (l>1) printf(" %ld", l); + break; + } + while (!(l%ll)) { + printf(" %ld", ll); + l /= ll; + } } + xputc('\n'); } - xputc('\n'); } void factor_main(void) |