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

题目描述
因为 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,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值