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.小结

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

相关推荐
q***2513 分钟前
java进阶1——JVM
java·开发语言·jvm
望眼欲穿的程序猿3 分钟前
Win系统Vscode+CoNan+Cmake实现调试与构建
c语言·c++·后端
while(1){yan}4 分钟前
线程的状态
java·开发语言·jvm
豐儀麟阁贵7 分钟前
8.3 Java常见的异常类
java·开发语言
lzh2004091912 分钟前
【C++STL】List详解
开发语言·c++
q***448115 分钟前
Java进阶10 IO流
java·开发语言
luoyayun36118 分钟前
Qt/C++ 线程池TaskPool与 Worker 框架实践
c++·qt·线程池·taskpool
济宁雪人21 分钟前
Java安全基础——文件系统安全
java·开发语言·安全
Charles_go22 分钟前
C#中级46、什么是模拟
开发语言·oracle·c#
20岁30年经验的码农25 分钟前
Java RabbitMQ 实战指南
java·开发语言·python