首页 > 其他分享 >洛谷刷题_P217 [USACO1.5]回文质数 Prime Palindromes

洛谷刷题_P217 [USACO1.5]回文质数 Prime Palindromes

时间:2022-11-12 17:45:49浏览次数:81  
标签:Prime 10 Palindromes int 质数 素数 num 回文

题目

P217 [USACO1.5]回文质数 Prime Palindromes

题目链接

https://www.luogu.com.cn/problem/P1217

知识点

埃氏筛

原理:

要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数筛掉,剩下的就是素数。
首先给出要筛选的范围n,要找到n以内的素数。首先把2留下,然后找出2的倍数都筛掉;再用下一个质数3,然后把3的倍数都筛掉,接着再把5的倍数筛掉,以此类推。

如何判断一个回文数:

通过末位乘10,然后再加倒数第二位之后,再乘10,以此类推,最终用结果来判断是否和原数相等,相等则是回文数。

11的整除性质:

如果一个整数的奇位数字之和与偶位数字之和的差能被11整除,则这个数能被11整除。

code

#include <stdio.h>
#include<cstring>
#include<math.h>
bool prime[10000000];
int a,b;
bool is_pd(int x)
{
	int y=x,num=0;
	while(y!=0)
	{
		num=num*10+y%10;
		y/=10;
	}
	if(num==x) return true;
	else return false; 	
}
void isprime(int n)
{
	for(int i=2;i<=n;i++)
	{
		if(prime[i])
		{
			for(int j=i*2;j<=n;j+=i)
			{
				prime[j]=false;
			}
		}
		
	}
} 
int main ()
{
	memset(prime,true,sizeof(prime));
	prime[0]=false;
	prime[1]=false;
	scanf("%d%d",&a,&b);
    //这里通过11的整除性质来确定偶数位的回文数一定不是素数
    //因为偶数位的回文数奇数位之和与偶数位之和的差是0,所以一定能被11整除
    //由于大于等于10000000的数一定是偶数位所以不用考虑
	if(b>=10000000) b=9999999;
	isprime(b);
	//if(a%2==0) a++;这里可以这么写,因为能被2整除的数一定不是素数
	//for(int i=a;i<=b;i+=2),所以这里能够减少一定的循环次数
	for(int i=a;i<=b;i++)
	{
		if(prime[i] && is_pd(i))
		{
			printf("%d\n",i);
		}
	}
	return 0;
}

小结

这道题刚开始提交的时候先是runtime error,发现是数组开太小了。

然后数组开大之和,发现又有两个测试点过不了。由于没有办法下载数据。所以稍微看了一下别人的AC代码,发现是埃氏筛那里写的有点问题

本来我是这样写的

void isprime(int n)
{
	for(int i=2;i<=sqrt(n);i++)
	{
		if(prime[i])
		{
			for(int j=i*2;j<n;j+=i)
			{
				prime[j]=false;
			}
		}	
	}
}

发现i和j的限制条件有点问题,应该改成是i<=n和j<=n,昨天的题目这么写是没有关系,但今天这么写发现是不太行的,问题应该是如果i只是小于sqrt(n)的话,在下面的循环筛素数的时候,有些数会筛不到,所以直接改成i<=n比较保险。j同理。

看了一下别人的做法,好像用线性筛更快(欧拉筛),或者是打表的方法。有兴趣的师傅也可以尝试一下。

标签:Prime,10,Palindromes,int,质数,素数,num,回文
From: https://www.cnblogs.com/Jinx8823/p/16884247.html

相关文章

  • 洛谷刷题_质数口袋
    P5723【深基4.例13】质数口袋题目链接:https://www.luogu.com.cn/problem/P5723知识点:埃氏筛原理:要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数筛掉,......
  • javascript基础算法之判断一个随机整数是否为质数
    质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;functionsolution(num){if(num<=1){return'数据错......
  • 通过调用函数判断一个数是否为质数
    /*//1.书写判断某个数是否为质数的方法,将这个方法封装在一个函数里    functionodd(a){      count=0      for(vari=1;i<......
  • 模板和泛型编程 C++ primer笔记
    16.1定义模板重载多个相似的函数是麻烦的:比如重载能接受多个类型的compare。使用函数模板之后可以定义成这样:template<typenameT>intcompare(constT&v1,constT......
  • UESTC 1272 Final Pan's prime numbers
    DescriptionFinalPanlikesprimenumbersverymuch.Oneday,hewanttofindthesuperprimenumbers.Aprimenumbers n(n>4)isasuperprimenumberonlyif ......
  • ZOJ 3911 Prime Query
    PrimeQueryTimeLimit: 1Second     MemoryLimit: 196608KBYouaregivenasimpletask.Givenasequence A[i] with NHerearetheoperations:Av......
  • 质数判断与欧拉筛(线性筛)
    质数定义质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。在整个自然数集合中,质数的数量不多,分布比较稀疏,对于一个足够大的整数\(N\),不超过\(N\)......
  • C++构造函数、隐式的类类型转换、类的静态成员---C++ primer 7.5 7.6笔记
    7.5构造函数再探构造函数初始化列表const和引用必须进行初始化,而不能在构造函数中赋值。classConstRef{public:ConstRef(intii);private:......
  • 判断一个数字是否为质数
    #include<stdio.h>#include<math.h>intisPrime(intn){ if(n<=0){ return0; } if(n==1){ return0; } if(n==2){ return1; } if(n%2==0){ return0......
  • 质数之和【计算第x个到第y个质数之和】
    题目:质数之和已知,第一个质数是2,第二个质数是3,第三个质数是5,第四个质数是7,第五个质数是11,第六个质数是13,第七个质数是17,输入两个不相等的正整数a和b,求出第a个质数到第b个质......