aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/factor.test4
-rw-r--r--toys/other/factor.c69
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)