输出【a,b】间既是回文数,又是素数的个数(5 <= a < b <= 10^8)
素数筛选法 枚举素数判断是否回文,超时超空间。所以可以先判断回文,再判断素数,因为回文数数量比素数少,但还是要开大数组。
所以用其他方法:除2外偶数肯定不是素数,除5外5结尾的肯定不是素数,除11外数字长度为偶数的不会同时是素数和回文数,因为是回文数的会被11整除
一个很大的优化是:从偶数长度的数跳到奇数长度的数,如判断1100不合条件,直接跳到10001判断
大量参考别人的博客
#include<stdio.h>
int ishuiwen(int i){ //判断回文
int m,n;
n = i;
m = 0;
while(n){
m = m * 10 + n % 10;
n /= 10;
}
if(m == i)
return 1;
return 0;
}
int isprime(int m){
int i;
for(i=3;i*i<=m;i+=2){ //+=2直接避开偶数
if( m % i ==0 )
return 0;
}
return 1;
}
int word_len(int x){ //求数字长度
int res = 0;
while(x){
res++;
x /= 10;
}
return res;
}
int ten_up(int m){ //变下一个10的倍数
int i,s = 10; //求10^m
for(i=1;i<m;i++)
s*=10;
return s;
}
int main()
{
int i,l,r,count;
// freopen("in.txt","r",stdin);
int len;
while(scanf("%d%d",&l,&r)!=EOF){
count = 0;
for(i=l;i<=r;i++){
if( i % 2 == 0 && i != 2 ) //除2外偶数不是素数
continue;
if( i % 5 == 0 && i != 5) //除5外5倍数不是素数
continue;
if(!ishuiwen(i))
continue;
len = word_len(i);
if( len % 2 == 0 && i != 11){ //除11外数字长度为偶数的不是回文数
i = ten_up(len); //这招牛,从偶数长度跳到奇数长度
continue; //下一轮是因为i++到了101之类带1而不是0结尾的
}
if(isprime(i))
count++;
}
printf("%d\n",count);
}
return 0;
}