xref: /plan9/sys/src/cmd/factor.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <u.h>
2*3e12c5d1SDavid du Colombier #include <libc.h>
3*3e12c5d1SDavid du Colombier #include <bio.h>
4*3e12c5d1SDavid du Colombier 
5*3e12c5d1SDavid du Colombier #define	whsiz	(sizeof(wheel)/sizeof(wheel[0]))
6*3e12c5d1SDavid du Colombier 
7*3e12c5d1SDavid du Colombier double	wheel[] =
8*3e12c5d1SDavid du Colombier {
9*3e12c5d1SDavid du Colombier 	 2,10, 2, 4, 2, 4, 6, 2, 6, 4,
10*3e12c5d1SDavid du Colombier 	 2, 4, 6, 6, 2, 6, 4, 2, 6, 4,
11*3e12c5d1SDavid du Colombier 	 6, 8, 4, 2, 4, 2, 4, 8, 6, 4,
12*3e12c5d1SDavid du Colombier 	 6, 2, 4, 6, 2, 6, 6, 4, 2, 4,
13*3e12c5d1SDavid du Colombier 	 6, 2, 6, 4, 2, 4, 2,10,
14*3e12c5d1SDavid du Colombier };
15*3e12c5d1SDavid du Colombier 
16*3e12c5d1SDavid du Colombier Biobuf	bin;
17*3e12c5d1SDavid du Colombier 
18*3e12c5d1SDavid du Colombier void	factor(double);
19*3e12c5d1SDavid du Colombier 
20*3e12c5d1SDavid du Colombier void
main(int argc,char * argv[])21*3e12c5d1SDavid du Colombier main(int argc, char *argv[])
22*3e12c5d1SDavid du Colombier {
23*3e12c5d1SDavid du Colombier 	double n;
24*3e12c5d1SDavid du Colombier 	int i;
25*3e12c5d1SDavid du Colombier 	char *l;
26*3e12c5d1SDavid du Colombier 
27*3e12c5d1SDavid du Colombier 	if(argc > 1) {
28*3e12c5d1SDavid du Colombier 		for(i=1; i<argc; i++) {
29*3e12c5d1SDavid du Colombier 			n = atof(argv[i]);
30*3e12c5d1SDavid du Colombier 			factor(n);
31*3e12c5d1SDavid du Colombier 		}
32*3e12c5d1SDavid du Colombier 		exits(0);
33*3e12c5d1SDavid du Colombier 	}
34*3e12c5d1SDavid du Colombier 
35*3e12c5d1SDavid du Colombier 	Binit(&bin, 0, OREAD);
36*3e12c5d1SDavid du Colombier 	for(;;) {
37*3e12c5d1SDavid du Colombier 		l = Brdline(&bin, '\n');
38*3e12c5d1SDavid du Colombier 		if(l ==  0)
39*3e12c5d1SDavid du Colombier 			break;
40*3e12c5d1SDavid du Colombier 		n = atof(l);
41*3e12c5d1SDavid du Colombier 		if(n <= 0)
42*3e12c5d1SDavid du Colombier 			break;
43*3e12c5d1SDavid du Colombier 		factor(n);
44*3e12c5d1SDavid du Colombier 	}
45*3e12c5d1SDavid du Colombier 	exits(0);
46*3e12c5d1SDavid du Colombier }
47*3e12c5d1SDavid du Colombier 
48*3e12c5d1SDavid du Colombier void
factor(double n)49*3e12c5d1SDavid du Colombier factor(double n)
50*3e12c5d1SDavid du Colombier {
51*3e12c5d1SDavid du Colombier 	double quot, d, s;
52*3e12c5d1SDavid du Colombier 	int i;
53*3e12c5d1SDavid du Colombier 
54*3e12c5d1SDavid du Colombier 	print("%.0f\n", n);
55*3e12c5d1SDavid du Colombier 	if(n == 0)
56*3e12c5d1SDavid du Colombier 		return;
57*3e12c5d1SDavid du Colombier 	s = sqrt(n) + 1;
58*3e12c5d1SDavid du Colombier 	while(modf(n/2, &quot) == 0) {
59*3e12c5d1SDavid du Colombier 		print("     2\n");
60*3e12c5d1SDavid du Colombier 		n = quot;
61*3e12c5d1SDavid du Colombier 		s = sqrt(n) + 1;
62*3e12c5d1SDavid du Colombier 	}
63*3e12c5d1SDavid du Colombier 	while(modf(n/3, &quot) == 0) {
64*3e12c5d1SDavid du Colombier 		print("     3\n");
65*3e12c5d1SDavid du Colombier 		n = quot;
66*3e12c5d1SDavid du Colombier 		s = sqrt(n) + 1;
67*3e12c5d1SDavid du Colombier 	}
68*3e12c5d1SDavid du Colombier 	while(modf(n/5, &quot) == 0) {
69*3e12c5d1SDavid du Colombier 		print("     5\n");
70*3e12c5d1SDavid du Colombier 		n = quot;
71*3e12c5d1SDavid du Colombier 		s = sqrt(n) + 1;
72*3e12c5d1SDavid du Colombier 	}
73*3e12c5d1SDavid du Colombier 	while(modf(n/7, &quot) == 0) {
74*3e12c5d1SDavid du Colombier 		print("     7\n");
75*3e12c5d1SDavid du Colombier 		n = quot;
76*3e12c5d1SDavid du Colombier 		s = sqrt(n) + 1;
77*3e12c5d1SDavid du Colombier 	}
78*3e12c5d1SDavid du Colombier 	d = 1;
79*3e12c5d1SDavid du Colombier 	for(i=1;;) {
80*3e12c5d1SDavid du Colombier 		d += wheel[i];
81*3e12c5d1SDavid du Colombier 		while(modf(n/d, &quot) == 0) {
82*3e12c5d1SDavid du Colombier 			print("     %.0f\n", d);
83*3e12c5d1SDavid du Colombier 			n = quot;
84*3e12c5d1SDavid du Colombier 			s = sqrt(n) + 1;
85*3e12c5d1SDavid du Colombier 		}
86*3e12c5d1SDavid du Colombier 		i++;
87*3e12c5d1SDavid du Colombier 		if(i >= whsiz) {
88*3e12c5d1SDavid du Colombier 			i = 0;
89*3e12c5d1SDavid du Colombier 			if(d > s)
90*3e12c5d1SDavid du Colombier 				break;
91*3e12c5d1SDavid du Colombier 		}
92*3e12c5d1SDavid du Colombier 	}
93*3e12c5d1SDavid du Colombier 	if(n > 1)
94*3e12c5d1SDavid du Colombier 		print("     %.0f\n",n);
95*3e12c5d1SDavid du Colombier 	print("\n");
96*3e12c5d1SDavid du Colombier }
97