USACO 回文素数

输出【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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值