求给定起止数范围内的质数,要求这些质数倒过来后也是质数,如:13 17 31 37 71 73
主要涉及到求质数的算法以及倒序一个数的算法,这里倒序我用了递归的方法实现,而求质数使用了6的倍数前后数才是质数的原理实现。
typedef long long ll;
// sz is array size.
typedef struct Data Data;
struct Data {
ll* array;
int sz;
};
/*递归方法返回一个数的倒序数*/
ll NumReverse(ll Num){
ll k = 0;
ll tmp = 0;
if(Num<10)
{
return Num;
}
else
{
k = (Num % 10);
tmp = Num;
while(tmp/=10)k*=10;
k += NumReverse(Num/10);
return k;
}
}
/*是否是质数*/
int isPrime(ll num){
ll max = sqrt(num);
if(num == 2 || num == 3) return 1;
if(num%6 != 1 && num%6 != 5) return 0;
for(ll i=5; i<=max; i+=6){
if(num%i == 0 || num%(i+2) == 0){
return 0;
}
}
return 1;
}
Data* backwardsPrime(ll start, ll end) {
Data *out = malloc(sizeof(Data));
out->array = 0;
out->sz = 0;
ll k;
for(ll i=start; i<=end; ){
switch(i%6){
case 0:
i+=1;
break;
case 2:
i += 3;
break;
case 3:
i+= 2;
break;
case 4:
i+=1;
break;
case 1:
case 5:
k = NumReverse(i);
if(i != k && isPrime(i) && isPrime(k)){
out->array = realloc(out->array, sizeof(ll)*(out->sz+1));
out->array[out->sz] = i;
out->sz += 1;
}
i = i%6 == 1 ? i+4 : i+2;
break;
}
}
return out;
}