El problema está en como se define si un número es primo o no:
nprim=(valor[i][j]%2)*1; // la multiplicación por 1 no hace absolutamente nada, todo número multiplicado por 1 da ese mismo número, por lo que nprim es el resto de la división del número entre 2.
if(nprim==1) // Solo se está comprobando que el resto de la división sea igual a 1, que en el caso de un número impar siempre será así ya que el resto de una división entre 2 solo puede ser 0 ó 1, siendo 1 si el número es impar y 0 si es par.
que es lo mismo que para los impares (solo que expresado de forma diferente):
numip=(valor[i][j]%2)-1; // El resto es 0 ó 1, al restarle 1 los pares son -1 y los impares 0
if(numip==0)
El comprobar si un número es primo no es una tarea simple:
http://es.wikipedia.org/wiki/Test_de_primalidad
http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes
Sin embargo se podría resolver de una forma simple partiendo del hecho de que los números primos son mayores que 1, que son divisibles únicamente por sí mismos y por la unidad, usando la siguiente función:
Código:
bool esprimo(int N)
{
if(N<=1) return false; // un primo debe ser mayor que 1
for(int divisor=N-1; divisor>1; divisor--) {
if(N%divisor==0) return false; // Si el número es divisible entre otro menor que él ya no es primo
}
return true;
}
Claro que no será el método más eficiente para determinar si un número muy grande es primo, pero funcionará.
Y por supuesto habría que cambiar el if de la función nprimos:
Código:
...
//nprim=(valor[i][j]%2)*1;
//if(nprim==1)
if(esprimo(valor[i][j]))
...