回文素数中回文数的筛选法与素数的开平方选取法(自我总结)

/*
1.回文数经研究可以发现最小间隔为2,所以往后寻找时可直接+2,又因为2和3是特例所以先将2固定好并从3开始进行向后查找
2.回文数为了提高搜索效率可以采用筛选法(如下)
https://baike.baidu.com/item/%E7%AD%9B%E9%80%89%E6%B3%95/9393288?fr=aladdin
3.主要是先进行第一个函数回文数的筛选,然后再进行回文数判断时可减少工作量
4.判断素数的函数因为类似100最大为10*10,所以可把临界条件设置为开平方此数
5.https://blog.csdn.net/tigerisland45/article/details/78736082
该算法的源博客
*/

#define TRUE 1
#define FALSE 0

int isnotprime[N + 1] = {0};//两个数组均先置为0
int prime[N] = {0}, pcount;

void setprime(int n)//n为你要求的回文数的个数
{
int i, j;
pcount = 0;
prime[pcount++] = 2; //第一个固定为2
for(i=3; i<=n; i+=2) //从3开始,每次+2
if(isnotprime[i] == FALSE) {
//若isnotprime[i]为0,即该数之前未曾被筛选标记,算进回文数中
prime[pcount++] = i;
for(j=i*i; j<=n; j+=2*i) //利用筛选法 i*2筛选将i所有倍数挑选出来
isnotprime[j] = TRUE;//将被筛选出来的数字进行标记,进行下一次循环
}
} //步骤完成可筛选出一次数组,之后再通过平常判断回文数的方法挑出回文数

int isPrime(int n, int prime[]) //
{
int i = 0, m = sqrt(n);//开平方
while(prime[i] <= m) {
if(n % prime[i] == 0)
return FALSE;
i++;
}
return TRUE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值