题目描述
因为 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
判断回文数(将整个数翻转)
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int t=n;
int y=0;
while(t)
{
y=y*10+t%10;
t/=10;
}
if(y==n)
cout << "yes";
else
cout << "No";
return 0;
}
判断回文数(将数字转化成字符串)
#include<iostream>
using namespace std;
bool fx(int n)
{
string s=to_string(n); //to_string 作用:将基本类型的值 转化成 字符串
//字符串可以通过下标访问 而数字不可以
int length=s.size();
for(int i=0; i<length;i++)
{
if(s[i]!=s[length-1-i])
return 0;
}
return 1;
}
int main()
{
int n;
cin >>n;
if(fx(n)==1)
cout << "yes";
else
cout << "No";
return 0;
}
构造回文数
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
int main() {
int m,n;
cin>>m>>n;
string s=to_string(n);
int t=s.size();//看它是多少位数
int tt=pow(10,(t+1)/2);//如果是5位数,那么就要由1到999构造出来,如果是4位数,就要1到99构造出来
map<int,int> ans;//存答案
for(int i=1;i<tt;i++)
{
string s1=to_string(i);
string s2=s1;
reverse(s2.begin(),s2.end());//倒转
int g1=stoi(s1+s2);//stoi()可以把字符串转为int 型
s2.erase(0,1);//删除第一个字母
int g2=stoi(s1+s2);
if(g1>=m&&g1<=n)ans[g1];//构造出来的数如果在这个范围里面就添加到答案里去
if(g2>=m&&g2<=n)ans[g2];
}
map<int,int>::iterator it ; //用迭代器遍历
for(it=ans.begin();it!=ans.end();it++)
{
cout<<it->first<<endl;
}
return 0;
}
AC代码
#include<iostream>
#include<cmath>
using namespace std;
bool fx(int n) //判断回文数
{
int t=n,y=0;
while(t)
{
y=y*10+t%10;
t/=10;
if(y==n) return 1;
}
return 0;
}
bool prime(int n) //判断质数
{
if(n<2) return 0;
for(int i=2;i<(int)sqrt(n)+1;i++)
{
if(n%i==0) return 0;
}
return 1;
}
int main()
{
int m , n;
cin >> m>> n;
if(n>=10000000) n=9999999; //简化范围
for(int i=m;i<n+1 ;i++)
{
if(fx(i)==1)
{
if(prime(i)==1)
{
cout << i << endl;
}
}
}
return 0;
}