Lo primero, cuidado con esas suposiciones...
una potencia de 2 elevada a un número primo, menos uno, da como resultado otro número primo
potencia de 2 := 4
numero primo := 2
4² - 1 = 15 = 3*5 -> 15 no es primo
Siguiente problema. Esa función <esPrimo()>...
numero := 49
49 = 7² -> 49 no es primo
Segun la funcion: EsPrimo(49) = true
Es decir esa función no es correcta. Tienes que echarle un vistazo a ver si eres capaz de solucionarlo antes de que te diga cómo se hace.
Aparte y esto es más tontería, como son <return> no hacen falta los <else> ya que si se ejecuta un <return>, va a salir de la función y no sé ejecuta el resto:
if(x == a)
return 1;
else if(x == b)
return 2;
else
return 3;
// Se puede dejar en
if(x == a) return 1;
if(x == b) return 2;
return 3;
Así queda más limpio y más simple al compilarlo.
Luego veamos la función <Potencia()>
Según el enunciado se te pide lo siguiente:
diseña, para ayudarte, una función 'Potencia' que eleve una base entera a una potencia entera y devuelva un 'unsigned long long' (¡no utilices la función 'pow'!).
Y tú creas esto:
// Cuidado que en el prototipo tienes un parametro y en la implementacion otro (unsigned int != unsigned long long)
// Funcion que calcula la potencia indicada en el parametro de 2, es decir, 2^exponente
unsigned long long Potencia(unsigned int exponente); // lo llamo exponente para que se entienda mejor
No has creado una función que eleve una base entera a una potencia entera. Has creado una función que eleva el 2 a una potencia NATURAL/entera positiva (0 incluido) (unsigned). Solo te lo comento para que veas la diferencia entre lo que te piden y lo que implementas. Lo suyo sería algo así:
unsigned long long Potencia2(int exponente); // dejar claro que esa funcion calcula potencias de 2
unsigned long long Potencia(int base, int exponente); // lo que te pide el enunciado
Y después de todo esta parrafada, te comento lo que tienes que hacer. Los números perfectos se pueden obtener a partir de la fórmula que has comentado arriba aunque primero dejemos claro un par de notaciones para poder explicarte el ejercicio:
Pi := numero perfecto i
Mi(p) := numero de Mersenne i cuya formula es 2^p-1. Se suele representar como Mp, por ejemplo, M7 = 2⁷-1 = 127 pero te lo representare como M4(7), es decir, el 4º numero primo de Mersenne (que se calcula con p = 7)
Entonces tenemos que: Pi = Mi(p) * 2^p
Un número se considera de Mersenne si p es primo y 2^p-1 también es primo. Los 10 primeros p que cumplen esta condición son {2, 3, 5, 7, 13, 17, 19, 31, 61, 89} y los números de Mersenne que genera cada p son {3, 7, 31, 127, 8191, 131071, 524287, 2147483647, 2305843009213693951, 618970019…449562111} respectivamente (están en Wikipedia estos datos:
https://es.wikipedia.org/wiki/N%C3%BAmero_primo_de_Mersenne)Te pongo una forma de hacerlo para que tengas una idea
p := 2 // uso el mismo nombre que en las formulas anteriores
num_perfectos := 0
mientras num_perfectos < 10
si esPrimo(p)
numero_mersenne := Potencia(2,p)-1
si esPrimo(numero_mersenne)
numero_perfecto[num_perfecto] := numero_mersenne * Potencia(2, p-1)
num_perfecto := num_perfecto + 1
fin si
fin si
p := p + 1
fin mientras
Lo siento por el mensaje tan largo pero espero haberlo explicado todo con claridad.