/****************************************************************************/ /* 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; }