54 lines
		
	
	
		
			885 B
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			885 B
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* factor - print the prime factors of a number      Author: Andy Tanenbaum */
 | 
						|
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
_PROTOTYPE(int main, (int argc, char **argv));
 | 
						|
_PROTOTYPE(long first, (long k));
 | 
						|
 | 
						|
int main(argc, argv)
 | 
						|
int argc;
 | 
						|
char *argv[];
 | 
						|
{
 | 
						|
/* Factor a number */
 | 
						|
 | 
						|
  long i, n, flag = 0;
 | 
						|
 | 
						|
  if (argc != 2 || (n = atol(argv[1])) < 2) {
 | 
						|
	printf("Usage: factor n   (2 <= n < 2**31)\n");
 | 
						|
	exit(1);
 | 
						|
  }
 | 
						|
  if (n == 2) {
 | 
						|
	printf("2 is a prime\n");
 | 
						|
	exit(0);
 | 
						|
  }
 | 
						|
  while (1) {
 | 
						|
	i = first(n);
 | 
						|
	if (i == 0) {
 | 
						|
		if (flag == 0)
 | 
						|
			printf("%ld is a prime\n", n);
 | 
						|
		else
 | 
						|
			printf("%ld\n", n);
 | 
						|
		exit(0);
 | 
						|
	}
 | 
						|
	printf("%ld ", i);
 | 
						|
	n = n / i;
 | 
						|
	flag = 1;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
long first(k)
 | 
						|
long k;
 | 
						|
{
 | 
						|
/* Return the first factor of k.  If it is a prime, return 0; */
 | 
						|
 | 
						|
  long i;
 | 
						|
 | 
						|
  if (k == 2) return(0);
 | 
						|
  if (k % 2 == 0) return (2);
 | 
						|
  for (i = 3; i <= k / 3; i += 2)
 | 
						|
	if (k % i == 0) return(i);
 | 
						|
  return(0);
 | 
						|
}
 |