Deberías dividir tu problema en subproblemas. De momento tienes aislada la parte para saber si un número es primo. Lo ideal ahora sería que pensaras en un módulo o función que te calculara la órbita de un número. Si lo integras todo en el main, el código será más difícil de leer y de corregir.
Aquí una propuesta de función:
int orbit(int n) {
int n_10 = n/10;
int orbit = n%10;
n = n_10;
while (n != 0) {
orbit *= 10;
n /= 10;
}
orbit += n_10;
return orbit;
}
Tu idea para obtener la "órbita" de un número (convirtiéndolo en una cadena y efectuando los desplazamientos correspondientes) es también válida.
Tu código es un poquitín chapuza por los siguientes motivos. Imagínate que evalúas el 23423426. Tu código comprueba la primera vez que no es primo, pero igualmente haces la rotación y vuelves a comprobar si es primo, y así 8 veces. Es evidente que si una sola de las órbitas del número no es prima, el número no puede ser primo circular y puedes parar y pasar a evaluar el siguiente número. Además, si tienes 7777, harás 4 comprobaciones, cuando está claro que es totalmente innecesario (da igual las rotaciones que le apliques a 7777, seguirá siendo el mismo número y por tanto, basta con una sola comprobación. Y por último, si tienes que un número es primo circular, esta claro que todos los números de su órbita son primos circulares también, y cuando llegues a ellos no haría falta hacer todas las comprobaciones de nuevo. Aquí un código que he hecho para este mismo problema en que tengo en cuenta todo esto:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int k = 0;
int isPrime(int n) {
int sqrt_n
= (int) sqrt(n
); int lim = (sqrt_n+1)/6;
int i;
if (n==2 || n==3) return 1;
if (n==1 || !(n%2) || !(n%3)) return 0;
for (i = 1; i <= lim; ++i) {
if (!(n%(6*i-1)) || !n%(6*i+1)) return 0;
++k;
}
return 1;
}
int orbit(int n) {
int n_10 = n/10;
int orbit = n%10;
n = n_10;
while (n != 0) {
orbit *= 10;
n /= 10;
}
orbit += n_10;
return orbit;
}
int main() {
int n,prime,i,j,s,q;
int* taken;
taken
= malloc(n
*sizeof(int)); for (i = 0; i < n; ++i) taken[i] = 0;
q = 1;
for (i = 3; i < n; i += 2) {
if (!taken[i]) {
j = i;
s = 0;
do {
if (j < n) {
taken[j] = 1;
++s;
}
prime = isPrime(j);
j = orbit(j);
} while (prime && j!=i);
if (prime) q += s;
}
}
return 0;
}