|
|
1.1 ! root 1: /* ! 2: * Factor prints out the prime factorization of numbers. ! 3: * If there are arguments, it factors them. ! 4: * If there are no arguments, it reads stdin until ! 5: * either EOF or the number zero or a non-numeric ! 6: * non-white-space character. Since factor does all of ! 7: * its calculations in double format, the largest number ! 8: * which can be handled is quite large. ! 9: */ ! 10: #include <stdio.h> ! 11: #include <math.h> ! 12: #include <ctype.h> ! 13: ! 14: ! 15: #define NUL '\0' ! 16: #define ERROR 0x10 /* largest input base */ ! 17: #define MAXNUM 200 /* max number of chars in number */ ! 18: ! 19: ! 20: main(argc, argv) ! 21: int argc; ! 22: register char *argv[]; ! 23: { ! 24: register char *chp; ! 25: double n; ! 26: double atod(); ! 27: char *getnum(); ! 28: ! 29: if (argc != 1) ! 30: while ((chp=*++argv) != NULL && ! 31: (n=atod(chp)) != 0) ! 32: factor(n); ! 33: else ! 34: while ((chp=getnum()) != NULL && ! 35: (n=atod(chp)) != 0) ! 36: factor(n); ! 37: return (0); ! 38: } ! 39: ! 40: ! 41: die(str) ! 42: char *str; ! 43: { ! 44: fprintf(stderr, "%r\n", &str); ! 45: exit(1); ! 46: } ! 47: ! 48: usage() ! 49: { ! 50: die("Usage: factor [number number ...]"); ! 51: } ! 52: ! 53: ! 54: char * ! 55: getnum() ! 56: { ! 57: register char *chp, ! 58: ch; ! 59: static char res[MAXNUM+1]; ! 60: ! 61: do { ! 62: ch = getchar(); ! 63: } while (isascii(ch) && isspace(ch)); ! 64: if (!isascii(ch) || todigit(ch) == ERROR) ! 65: return (NULL); ! 66: for (chp=res; isascii(ch) && !isspace(ch); ! 67: ch=getchar()) ! 68: if (chp < &res[MAXNUM]) ! 69: *chp++ = ch; ! 70: if (chp >= &res[MAXNUM]) ! 71: die("number too big"); ! 72: *chp++ = NUL; ! 73: return (res); ! 74: } ! 75: ! 76: ! 77: /* ! 78: * Factor is the routine that actually factors the double `n'. ! 79: * It writes the prime factors to standard output. ! 80: */ ! 81: factor(n) ! 82: double n; ! 83: { ! 84: double temp, ! 85: limit, ! 86: try; ! 87: ! 88: while (n > 1 && modf(n/2, &temp) == 0) { ! 89: printf("2 "); ! 90: n = temp; ! 91: } ! 92: limit = sqrt(n); ! 93: for (try=3; try <= limit; try += 2) { ! 94: if (modf(n/try, &temp) != 0) ! 95: continue; ! 96: do { ! 97: printf("%.0f ", try); ! 98: n = temp; ! 99: } while (modf(n/try, &temp) == 0); ! 100: limit = sqrt(n); ! 101: } ! 102: if (n > 1) ! 103: printf("%.0f", n); ! 104: putchar('\n'); ! 105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.