Cita de: crack81 en 8 Noviembre 2014, 07:11 AM
tu codigo espero te sirva y practica mas
Sólo le veo un "pero" a tu propuesta y es que si introduces 123456789 sencillamente se eterniza la respuesta. El problema radica en que después de encontrar el primo mayor, 123456761, sigue comprobando con el 123456760, 123456759, ...... y como ves son muchos millones de primos a comprobar hasta llegar al 23.
La modificación que propongo lo que hace es, después de localizar al primo mayor más próximo al número introducido, es continuar comprobando desde el número introducido menos el mayor primo calculado es decir: 12346789 - 123456761 = 28 e inferiores. Como ves se pasa de comprobar millones de números a unas pocas decenas lo que redunda en una mayor velocidad:
Código (cpp) [Seleccionar]
void SumaDePrimos ( int num ) {
int i , j , flag = 0 ,cont = 0 , suma = 0 ;
for( i = num ; i >= 1 ; i-- ) {
for ( j = i ; j >= 1 ; j-- )
if ( i % j == 0 )
cont++ ;
if( cont == 2 || cont == 1 ) {
suma += i ;
if ( suma < num )
printf ( "%d " , i ) ;
else if ( suma == num ) {
printf ( "%d " , i ) ;
break;
}
else if ( suma > num )
suma -= i ;
if ( flag == 0 ) /* AQUI ESTA LA DIFERENCIA */
i = num - i , flag = 1 ;
}
cont=0;
}
}
Evidentemente se puede mejorar con sucesivas aproximaciones pero no es plan de hacer la tarea totalmente.
¡¡¡¡ Saluditos! ..... !!!!