题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)a,b( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入 #1
5 500
输出 #1
5
7
11
101
131
151
181
191
313
353
373
383
方法一:暴力打表
回文质数的性质1:偶数肯定不是质数。
回文质数的性质2:偶数位数回文数(除11)必定不是质数,所以只要运行到10000000(剔除了所有的八位数,一亿既不是回文数也不是质数)。(玄学)
打表:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
bool isPrime(int num)
{
for (int i = 2; i*i <= num; i++){
if (num % i == 0){
return false;
}
}
return true;
}
bool isPalindrome(int num)
{
if (num % 2 == 0 || num > 10000000)//筛选数据
return 0;
int tmp_num = num, re_num = 0;
while (tmp_num != 0){
re_num = re_num * 10 + tmp_num % 10;
tmp_num /= 10;
}
if (re_num == num)
return true;
else
return false;
}
int main()
{
int left, right;
int cnt = 0, cnt1 = 0;//cnt1记录数据的总数,cnt记录一行数据的个数,每隔十次清零一次,方便复制粘贴。
ofstream test("//home/deepin/Desktop/C++/IN.txt", ios::out);//通过文件流对象将数据导出到文本里,方面复制粘贴,也可以直接用cout输出
test.clear();
for (int i =5; i <= 10000000; i++){
if (isPalindrome(i) && isPrime(i)){
//先判断回文数再判断质数
test << i << ',';
cnt1++;
cnt++;
if (cnt == 10){
cnt = 0;
test << endl;
}
}
}
cout << cnt1 << endl;
test.close();
return 0;
}
提交:
#include <iostream>
using namespace std;
int main()
{
int left, right, arr[779]={
5,7,11,101,131,151,181,191,313,353,
373,383,727,757,787,797,919,929,10301,10501,
10601,11311,11411,12421,12721,12821,13331,13831,13931,14341,
14741,15451,15551,16061,16361,16561,16661,17471,17971,18181,
18481,19391,19891,19991,30103,30203,30403,30703,30803,31013,
31513,32323,32423,33533,34543,34843,35053,35153,35353,35753,
36263,36563,37273,37573,38083,38183,38783,39293,70207,70507,
70607,71317,71917,72227,72727,73037,73237,73637,74047,74747,
75557,76367,76667,77377,77477,77977,78487,78787,78887,79397,
79697,79997,