P1217 [USACO1.5]回文质数 Prime Palindromes

这题绝对是个大坑,,,一不小心就超时。。。尝试了无数次,我终于通过了,激动。。

以下是我的思路:

1.首先写判断回文的函数

(题目最后有提示我们说先判断是否是回文,再判断是否是质数,并且提示我们先构造回文——我觉得构造回文有点点麻烦,还不如直接判断,事实上,直接判断并未超时)

2.写判断素数的函数

(次数有坑:题目中说明了啊a>=5,也就是说不用考虑1和2,这样代码就更加简洁了)

判断是否是素数的终止条件应该是x<sqrt(x)这样能减少判断次数,节省时间

3.直接上代码:

#include<bits/stdc++.h>
using namespace std;
bool ISS(int x)//判断是否是质数 
 {
	for(int i=2;i<=sqrt(x);i++ )
		if(x%i==0) return false;
	return true;
  } 
bool ISH(int x)//判断是否是回文 
{
	int N_x=0;//记录翻转之后的数,即新的x 
	int temp=x;
	while(temp)
	{
		N_x=N_x*10+temp%10;
		temp/=10;
	 } 
	if(N_x==x) return true;
	else return false;
}
int main()
{ 
	int a,b;
	cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
    	if(i%2==0) continue;//过滤偶数,减少判断
    	if((i>1000&&i<10000)||(i>100000&&i<1000000)||(i>10000000&&i<100000000)) continue;//4.6.8位的回文数都能被11整除 
		if(!ISH(i)) continue;
		if(!ISS(i)) continue;
		cout<<i<<endl;
	}
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值