vijos 1042 捕风捉影

这题与hdu上的1431类似,结合了之前的经验,还是很轻松的a了这题.

第一条件是素数,果断筛选(模版走起),应该没什么问题.

之后就是回文了,简单说说可以优化的地方

1.   5-99内满足题意的数只有5,9,11;因此,我们直接从100开始找.

2.   其次就是偶数位回文数必定能被11整除,被整除之后的数依然回文(但回文数乘以11并不一定是回文数),因此偶数位的数可以直接跳过,我们直接把奇数位的回文数乘以11,再判断得到的数是否回文,这样就节省了很多的时间.

3   题目范围是5到10的八次方,但实际上10的7次方以上就没有满足题意的数了,因此判断到10的7次方直接break

#include<iostream>
#include<cstdio>
using namespace std;
#define pr 11000000
int u[pr]={0};
void prime()
{
	int i,j;
	u[0]=1,u[1]=1;
	for(i=2;i<pr;i++)
	{
		if(!u[i])
		{
			for(j=2;i*j<pr;j++){u[i*j]=1;}
		}
	}
}
/*int numtest(int x)
{
	int sum=0;
	while(x>0)
	{
		sum++;
		x/=10;
	}
	return sum%2==0? 1:0;
}*/
int backtest(int x)
{
	int n=0,m=x;
	while(m)
	{
		n=n*10+m%10;
		m/=10;
	}
	return n==x? 1:0;
} 
void backstr()
{
	u[5]=2;
	u[7]=2;
	u[11]=2;
	int i;
	for(i=100;i<=10000000;i++)
	{
		if(i==1000||i==100000)//1000-100000与1000000-10000000都是偶数位,所以直接跳过 
		{
			i*=10;
			continue;
		}
		if(!u[i]&&backtest(i))
		{
			u[i]=2;
			if(i*11<10000000&&!u[i*11]&&backtest(i*11))
			{
				u[i*11]=2;
			}
		}
	}
}
int main()
{
	cin.sync_with_stdio(false);
	prime();
	backstr();
	int x,y;
	scanf("%d%d",&x,&y);
	int i;
	for(i=x;i<=y;i++)
	{
		if(i>=pr-1){break;}
		if(u[i]==2)
		{
			printf("%d\n",i);
		}
	}
	return 0;
} 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值