C语言洛谷题目分享(11)回文质数

目录

1.前言

2.题目:回文质数

1.题目描述

2.输入格式

3.输出格式

4.输入输出样例

5.题解

3.小结


1.前言

哈喽大家好,今儿继续为大家分享一道蛮有价值的一道题,希望大家多多支持喔~

2.题目:回文质数

1.题目描述

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以151 是回文质数。

写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。

2.输入格式

第一行输入两个正整数 a 和 b。

3.输出格式

输出一个回文质数的列表,一行一个。

4.输入输出样例

5.题解

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int l, r;
bool check1(int x)//检查位数
{
	if((1000 <= x && x <= 9999) || (100000 <= x && x <= 999999)) return 0;//不知道&&和||优先级的可以打个括号 
	return 1;
} 
bool check2(int x)//检查是否回文
{
	int a[10], flag = 1;
	while (x > 0)
	{
		a[flag] = x % 10;
		x /= 10;
		flag++;
	} 
	for (int i = 1; i <= flag / 2; i++)
		if(a[i] != a[flag-i]) return 0;//不符合回文 
	return 1;
} 
bool check3(int x)//检查是否为质数 
{
	if(x == 2) return 1;
	for(int i = 2; i <= sqrt(x); i++)
		if(x % i == 0) return 0;
	return 1;
}
int main()
{
	scanf("%d %d", &l, &r);
	if(l == 2) printf("2\n");//一定要注意2!!! 
	if(l % 2 == 0) l++; 
	r = min(9999999, r);//再大的数都不可能是回文质数
	for(int i = l; i <= r; i = i + 2)//枚举每一个奇数
	{
		if(check1(i) == 0) continue;
		if(check2(i) == 0) continue;
		if(check3(i) == 0) continue;
		printf("%d\n", i);
	}	
	return 0;
}

这道题题意非常简单,看似就俩个条件,先判断是否回文再判断是否为质数,但如果当你真的这样做了,那么tle等着你(不要问我我为什么会知道),所以当你正式开始敲代码的啥时候,先尝试一下如何优化当前代码。

在正式开始讲解之前,先需要给大家模拟一个东西,即一个偶位数的回文数(除了11)一定不是质数,演算如下:

考虑偶位数位的回文数的特性:由于回文数的特性,其前半部分和后半部分是完全相同的。因此,一个偶位数位的回文数可以表示为ABBA或ABCCBA其中A和B是任意数字,且A不为0,因为回文数的首位不能是0。可以通过简单证明,这个数可以被11整除。

仅以四位数举例:ABBA,千位和百位先除以11,_(B-A)BA,百位和十位除以11,得AA,则该数可以被11整除,别的同理。

综上所述,该命题成立。

证明完成后,我们便可以把这个作为限制条件实现在我们的代码中,判断这个数是否为奇数位,如果不是则直接continue,来达到节省时间的目的。

此外,还有要注意的点,就是每当输入r和l的时候,可以先判断r是否为偶数(因为偶数一定不是质数),如果l是偶数,则+1处理。另外还有r,如果r大于100000000,则就将r限制在100000000(题目条件)。

整体思路如下:

  • 1.先判断是否为奇数位
  • 2.再判断是否回文
  • 3.在判断是否为质数
  • 主函数中注意r和l的输入处理,用单个for循环嵌套三个函数来判断该书是否为回文质数。

3.小结

今天的题目分享到这里就结束了,希望大家都继续加油努力,一起进步!

相关推荐
DougLiang30 分钟前
关于easyexcel动态下拉选问题处理
java·开发语言
mochensage37 分钟前
CSP信奥赛C++常用系统函数汇总
c++·信奥
mochensage39 分钟前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
fpcc43 分钟前
跟我学c++中级篇——多线程中的文件处理
c++
chengooooooo1 小时前
leetcode Top100 238. 除自身以外数组的乘积|数组系列
算法·leetcode
GUIQU.1 小时前
【每日一题 | 2025年6.2 ~ 6.8】第16届蓝桥杯部分偏简单题
算法·蓝桥杯·每日一题
全职计算机毕业设计1 小时前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
5:002 小时前
云备份项目
linux·开发语言·c++
weixin_527550402 小时前
初级程序员入门指南
javascript·python·算法
笨笨马甲2 小时前
Qt Quick模块功能及架构
开发语言·qt