| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| |
| #define whsiz (sizeof(wheel)/sizeof(wheel[0])) |
| |
| double wheel[] = |
| { |
| 2,10, 2, 4, 2, 4, 6, 2, 6, 4, |
| 2, 4, 6, 6, 2, 6, 4, 2, 6, 4, |
| 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, |
| 6, 2, 4, 6, 2, 6, 6, 4, 2, 4, |
| 6, 2, 6, 4, 2, 4, 2,10, |
| }; |
| |
| Biobuf bin; |
| |
| void factor(double); |
| |
| void |
| main(int argc, char *argv[]) |
| { |
| double n; |
| int i; |
| char *l; |
| |
| if(argc > 1) { |
| for(i=1; i<argc; i++) { |
| n = atof(argv[i]); |
| factor(n); |
| } |
| exits(0); |
| } |
| |
| Binit(&bin, 0, OREAD); |
| for(;;) { |
| l = Brdline(&bin, '\n'); |
| if(l == 0) |
| break; |
| n = atof(l); |
| if(n <= 0) |
| break; |
| factor(n); |
| } |
| exits(0); |
| } |
| |
| void |
| factor(double n) |
| { |
| double quot, d, s; |
| int i; |
| |
| print("%.0f\n", n); |
| if(n == 0) |
| return; |
| s = sqrt(n) + 1; |
| while(modf(n/2, ") == 0) { |
| print(" 2\n"); |
| n = quot; |
| s = sqrt(n) + 1; |
| } |
| while(modf(n/3, ") == 0) { |
| print(" 3\n"); |
| n = quot; |
| s = sqrt(n) + 1; |
| } |
| while(modf(n/5, ") == 0) { |
| print(" 5\n"); |
| n = quot; |
| s = sqrt(n) + 1; |
| } |
| while(modf(n/7, ") == 0) { |
| print(" 7\n"); |
| n = quot; |
| s = sqrt(n) + 1; |
| } |
| d = 1; |
| for(i=1;;) { |
| d += wheel[i]; |
| while(modf(n/d, ") == 0) { |
| print(" %.0f\n", d); |
| n = quot; |
| s = sqrt(n) + 1; |
| } |
| i++; |
| if(i >= whsiz) { |
| i = 0; |
| if(d > s) |
| break; |
| } |
| } |
| if(n > 1) |
| print(" %.0f\n",n); |
| print("\n"); |
| } |