diagrama numero perfecto

sindyfair5
23 de Enero del 2006
quisiera poder consegui un diagrama que me indique si un numero es perfecto o si no lo es, para ser mas clara les digo que un numero perfecto es aque cuya sume de sus multiplos es igual al mismo numero ejemplo: 6=1+2+3
porfavor ayudenme n_n

Diego
23 de Enero del 2006
El método más eficiente pero menos ortodoxo para saber si un número es perfecto (int o long) es comparar el número con los perfectos que hay dentro del rango de valores disponible:
public static boolean esPerfecto(long x)
{
if((x&1)==1)
return false;
long [] perfecto={6L,28L,496L,8128L,33550336L,8589869056L,
137438691328L,Long.MAX_VALUE};
// El problema que podría existir en el caso que x fuese igual
// a Long.MAX_VALUE no se da, debido a que éste es impar.
int i=0;
while(perfecto[i]<x)
i++;
return x==perfecto[i];
}
El siguiente modo sirve para un número de cualquier tamaño y aprovecha una propiedad de los números perfectos;
public static boolean esPerfecto(long x)
{
if((x&1)==1||x<6)
return false;
long aux;
int ceros=0;
int unos=0;
while((x&1)==0)
{
x>>=1;
ceros++;
}
aux=x;
while((x&1)==1)
{
x>>=1;
unos++;
}

return (x==0)&&(unos==ceros+1)&&(unos==primerDivisor(unos))&&
(aux==primerDivisor(aux));
}

public static long primerDivisor(long x)
{
boolean primo=true;
if(x>3)
{
if(x%2==0)
x=2;
else if(x%3==0)
x=3;
else
{
int uno=-1;
long cont=5;
long limite=(long)Math.sqrt(x);
while(primo&&cont<=limite)
{
if(x%cont==0)
primo=false;
else
{
cont+=3+uno;
uno=-uno;
}
}
if(!primo)
x=cont;
}
}
return x;
}

Espero que te sirva

Sasi
23 de Enero del 2006
int num=496;//el número a testear
int aux=num;
for(int i=num-1;i>0;i--){
if(num%i==0)aux=aux-i;//restamos su divisor

}
if(aux==0)System.out.println("PERFECTO");//es perfecto
else System.out.println("NO PERFECTO");//no es perfecto

Sasi
23 de Enero del 2006
He estado pensando... no tiene mucho sentido que mires los números entre num-1 y 0; podrías mirar entre num/2 y 1. ya que los numeros entre num-1y num/2 no serán nunca divisores de num.
Ojo con los números menores de 6 en ambos casos.