Si ponés un 1 o un 2 en tu programa, no entra ni siquiera una vez en el for, porque no se cumple la condición (i < valor), ya que i comienza en el número 2. Sin embargo, no está bien el algoritmo. Ese bucle no hace nada. ¿Como sabés si es primo o no ahí? Primero pensá el problema matemáticamente, luego pasalo a la máquina tal cual lo pienses. En este caso, un número es primo si y solo si es divisible sólo por si mismo y por el 1. Entonces, para pasarlo a máquina, tendrás que ver si el número es divisible por algún número entre el 1 y el mismo. Para eso se usa el bucle, cuando encuentres algún número que divida a tu valor, entonces no será primo (ahí entra el flag en funcionamiento), sino, es primo.
En el caso de la aproximacion de fuerza bruta esta se puede mejorar un poco reduciendo el rango y utilizando al contador del bucle como bandera. De esta forma:
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
Ahora me piden que: Para mejorar la eficiencia del programa, el bucle debe finalizar una vez encontrado el primer divisor. Para ello deberá hacer uso de la variable de control usada en el apartado anterior.
No lo entiendo, ¿se supone que el programa ya termina cuando encuentra un divisor no?
Te recomiendo enormemente ponerle respectivas llaves a todas las instrucciones, más allá de que lleven una sola sentencia o no. Ahora bien, no, ahí el programa sigue hasta terminar con el bucle for.
Para que termine cuando el flag lo indique o cuando llegue a terminar todas las repeticiones deberás usar otra estructura repetitiva (while o do-while) con 2 condiciones: Que el flag siga siendo falso y hasta que llegue al valor en cuestión.
ya mira, cuando haces el FOR, dices: "Declara una variable 'i' que inicie en dos(2) y que se aumente en 1(i++) mientras que sea menor a el valor de 'n'.".
Con esto haces que tu variable 'i' haga el recorrido desde el numero 2 hasta n. Si vez bien el código que te puse usé la siguiente linea para el FOR:
Código
for(int i=2; i < n && flag==0;i++)
Con esto digo: "Declara una variable 'i' que inicie en dos(2) y que se aumente en 1(i++) mientras que mi variable 'i' sea menor que 'n' y además que mi variable 'flag' sea sea exactamente igual a cero(0)".
Si te das cuenta en tu código haces un 'if' donde preguntas si el residuo de tu valor entre el valor que lleva la variable 'i' es cero(0), entonces cambie tu flag a 0, ese valor puedes utilizarlo en el for para que si 'flag' es distinto(!=) de cero(0) entonces continúe con la ejecución del for.