| Line | |
|---|
| 1 | /* factor - print the prime factors of a number Author: Andy Tanenbaum */
|
|---|
| 2 |
|
|---|
| 3 | #include <stdlib.h>
|
|---|
| 4 | #include <stdio.h>
|
|---|
| 5 |
|
|---|
| 6 | _PROTOTYPE(int main, (int argc, char **argv));
|
|---|
| 7 | _PROTOTYPE(long first, (long k));
|
|---|
| 8 |
|
|---|
| 9 | int main(argc, argv)
|
|---|
| 10 | int argc;
|
|---|
| 11 | char *argv[];
|
|---|
| 12 | {
|
|---|
| 13 | /* Factor a number */
|
|---|
| 14 |
|
|---|
| 15 | long i, n, flag = 0;
|
|---|
| 16 |
|
|---|
| 17 | if (argc != 2 || (n = atol(argv[1])) < 2) {
|
|---|
| 18 | printf("Usage: factor n (2 <= n < 2**31)\n");
|
|---|
| 19 | exit(1);
|
|---|
| 20 | }
|
|---|
| 21 | if (n == 2) {
|
|---|
| 22 | printf("2 is a prime\n");
|
|---|
| 23 | exit(0);
|
|---|
| 24 | }
|
|---|
| 25 | while (1) {
|
|---|
| 26 | i = first(n);
|
|---|
| 27 | if (i == 0) {
|
|---|
| 28 | if (flag == 0)
|
|---|
| 29 | printf("%ld is a prime\n", n);
|
|---|
| 30 | else
|
|---|
| 31 | printf("%ld\n", n);
|
|---|
| 32 | exit(0);
|
|---|
| 33 | }
|
|---|
| 34 | printf("%ld ", i);
|
|---|
| 35 | n = n / i;
|
|---|
| 36 | flag = 1;
|
|---|
| 37 | }
|
|---|
| 38 | }
|
|---|
| 39 |
|
|---|
| 40 |
|
|---|
| 41 | long first(k)
|
|---|
| 42 | long k;
|
|---|
| 43 | {
|
|---|
| 44 | /* Return the first factor of k. If it is a prime, return 0; */
|
|---|
| 45 |
|
|---|
| 46 | long i;
|
|---|
| 47 |
|
|---|
| 48 | if (k == 2) return(0);
|
|---|
| 49 | if (k % 2 == 0) return (2);
|
|---|
| 50 | for (i = 3; i <= k / 3; i += 2)
|
|---|
| 51 | if (k % i == 0) return(i);
|
|---|
| 52 | return(0);
|
|---|
| 53 | }
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.