EDITADO con una sensible mejoría.
como dijo avesudra se puede afinar mas y lo hice quitando todos los numeros pares mayores a 2 con esto se reducen en 50% la velocidad de procesamiento
si alguien quiere ver cuanto mejora el rendimiento en su maquina les dejo el codigo completo les da el tiempo de procesamiento en milisegundos
mi version original con una cifra de 10000000 casi se quedaba congelada la maquina
con el arreglo de leosansan tarda unos 3319 milisegundos
y descartando los pares unos 1572 milisegundos
No me gusta en general el uso de las operaciones "%" y "sqrt" por su costo y en lo posible evito su uso. No es que esté mal pero si puedo evitarlas mejor que mejor.
Aquí una salida, como indica
crack81, para 10 000 000:
Ingrese un valor :
10000000
9999991 7 2
274.1995607633197 milliseconds
Como se observa he bajado el valor de
crack81 de 1572 ms a tan solo 274 ms.
Y respetando la idea original de
crack81 ahí va la función que logra lo anterior:
void SumaDePrimos ( int num ) {
int i , i2 , j , num1 , flag = 0 ,cont = 0 , suma = 0 ;
num1 = ( num % 2 == 0 ) ? num - 1 : num ; /* TOMO EL IMPAR SI NO LO ES */
for( i = num1 ; i >= -2 ; i -= 2 ) { /* VOY DE DOS EN DOS Y EVITO LA OPERACION % */
if ( i == 1 ) i = 2 ; /* ¡¡¡¡¡¡ */
if ( i == - 2 ) i = 1 ; /* ¡¡¡¡¡¡ */
i2 = i * i ; /* EVITO LA OPERACION SQRT */
for ( j = 1 ; j <= i2 ; j += 2 ) {
if ( i % j == 0 ) {
cont++ ;
if ( cont == 3 ) /* SI OCURRE NO ES PRIMO Y CORTO EL BUCLE */
break ;
}
}
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 ) /* TOMO EL IMPAR SI NO LO ES */
i = num1 - i + 1 , flag = 1 ;
}
cont=0;
}
}
¡¡¡¡ Saluditos! ..... !!!!