/****************************************************************************/
/* Clasifica números enteros en deficientes (sigma(n)<2n),                  */
/* perfectos (sigma(n)=2n) o abundantes (sigma(n)>2n) siendo                */
/* sigma(n) la suma de los divisiores de n.                                 */
/*                                                                          */
/* Jaime Suarez <mcripto@bigfoot.com> 2003                                  */
/* en http://elparaiso.mat.uned.es                                            */
/****************************************************************************/

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

typedef unsigned long ulong;
ulong sigma(ulong n);

int main(int argc, char *argv[])
{
	int i;
	ulong n;
	long dif;

	if (argc==1) {
		printf("Uso: %s n1 [n2] ...[nk]\n",argv[0]);
		printf("clasifica enteros como deficientes, ");
		printf("perfectos o abundantes\n");
		return 1;
	}
	for (i=1; i<argc; i++) {
		n= (ulong)atol(argv[i]);
		printf("%ld es ",n);
		dif= sigma(n)- 2*n;
		if (dif<0)
			printf("deficiente.\n");
		else if (dif==0)
			printf("perfecto.\n");
		else
			printf("abundante.\n");
		
	}
	
	return 0;
}

/*
 *  sigma(n) : suma de los divisores de n
 */

ulong sigma(ulong n)
{
	ulong p,e;
	float s;

	s=1.0;
	if ((float)n/2 == n/2) {
		e=0;	
		while ((float)n/2 == n/2) { n/=2; e++; }
		s *= (pow(2, e+1)-1)/(float)(2-1);
	}
	
	for (p=3; p*p<=n; p+=2) {
		if ((float)n/p == n/p) {
			e=0;
			while ((float)n/p == n/p) {n/=p; e++;}
			s *= (pow(p, e+1)-1)/(float)(p-1);
		}
	}
	if (n!=1) s *= (n*n-1.0)/(n-1.0);

	return (ulong)s;
}