回文质数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
因为151既是一个质数又是一个回文数(从左到右和从右到左看是一样的),所以151是回文质数.
写一个程序来找出范围[a,b](5<=a<b<=100,000,000)间的所有回文质数.
输入:
第一行 两个整数:a和b.
输出:
输出一个回文质数的列表,一行一个.
输入样例:
5 500
输出样例:
5 7 11 101 131 151 181 191 313 353 373 383
此题关键是减少循环
1.判断素数时排除偶数,减少一半循环量
2.判断素数循环时,只循环到算数平方根即可,减少大量循环
3 构造回文数,用至多五位数进行构造,不用10000000000
#include<iostream>
#include<math.h>
using namespace std;
int sushu(int n);
int huiwen(int m);
int a,b;
int main()
{
int i,m;
cin>>a>>b;
if(a<12) //如果a是小于12的数,无法构造回文数,需要单独讨论,将其中的质数输出
{
if(a==1) //这里要把a=1的情况排除,使a=2
a++;
for(i=a;i<12&&i<b;i++) //这里注意循环终止条件必须是a同时小于12和b
{
if(sushu(i))
cout<<i<<endl;
}
}
for(i=10;i<10000;i++) //此后输出构造的回文数
{
m=huiwen(i);
if(m>=a&&m<=b) //判断构造的回文数是否在a b之间
{
if(sushu(m)) //判断回文数是否是素数,如果是,输出
cout<<m<<endl;
}
}
}
int huiwen(int m) //构造回文数
{
int temp;
temp=m/10;
while(temp!=0)
{
m=m*10+temp%10;
temp=temp/10;
}
return m;
}
int sushu(int n) //判断素数
{
int i,j;
if(n%2==0&&n!=2) //将偶数排除,可以减少一半循环
return 0;
for(i=3;i<=sqrt(n);i=i+2) //临界值到平方根即可,sqrt()表示算术平方根
{
if(n%i==0)
{
return 0;
}
}
return 1;
}