1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
// 1x27: Hallar los cuatro primeros números perfectos. /* Problemas conocidos: El algoritmo es poco eficiente y el tercer y cuarto número perfecto tarda mucho tiempo (horas) en hallarlos. Num3: http://goo.gl/udkji */ #include <stdio.h> // Función que comprueba si un número es primo: int esPrimo( int num ){ // Precondición: Se ha de recibir un parámetro de tipo entero. // Poscondición: Se devuelve un 0 en caso de falso o un 1 en caso de verdadero. int i = 2; int bol = 1; //true for ( i; i<num; i++ ){ if( num%i == 0 ){ bol = 0; //false break; }; }; return bol; }; // Función elevar a exponente: int exponente( int numA, int numB){ // Precondición: Se han de recibir dos parámetros de tipo entero. // Poscondición: Se devolverá un parámetro entero. int i, exp=1; for( i=0; i<numB; i++ ){ exp *= numA; }; return exp; }; main(){ system("clear"); int i; int j; int bol = 0; int x; int suma = 0; printf("Los cuatro primeros numeros perfectos son:\n"); for( i=1; bol!=4; i++ ){ //printf( "I=%i\n",i ); // Solucion poca eficiencia: /* for( j=1; j<i; j++ ){ x = exponente(2,j)-1; if( esPrimo(x) == 1 && exponente(2,j-1)*x == i ){ // Si 2^n-1 es primo y N = 2^(n-1)*(2^n-1), entonces N es perfecto. //printf( "J=%i\n",j ); bol++; printf(" El %d es: %d\n", bol, i); break; }; }; */ // Soluciion porfesor, mal implementada por ahora: /* for( j=1; j<i; j++ ){ if(i%j==0){ suma+=j; }; }; if (suma==i){ printf("%i es numero perfecto", i); }; bol++; */ }; printf( "\n\n" ); }; |