Sicily 4190. Prime Palindromes 解题报告

本文介绍了一种寻找特定范围内回文素数的有效算法,并通过筛选法实现素数判断,最终输出指定区间内的所有符合条件的回文素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Constraints

Time Limit: 1 secs, Memory Limit: 256 MB

Description

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .

Input

There are multiple test cases.

Each case contains two integers, a and b.

a=b=0 indicates the end of input.

Output

For each test case, output the list of palindromic primes in numerical order, one per line.

 

Sample Input

5 500
0 0

Sample Output

5
7
11
101
131
151
181
191
313
353
373
383

 

这是非常纠结的一道题目。一开始的算法老超时,才返现原来将数字转化为string的时候用了sstream函数库函数会非常的慢,于是参照别人的办法用了下面的代码。结果还是一直超时,原本见题目有一亿的数于是开了long long,结果尝试一下改为int之后竟然过了!被坑的无语!

题目思路还是非常清晰的,先用筛选法求素数打出在范围内的素数表,再对其中的素数判断是否是回文数,将是的存进一个数组中方便最后的查找输出。

题目有几点要注意的地方:

1.由于数组比较大所以要声明在main函数的外面,否则会很容易爆栈。

2.这里涉及到筛选法求素数,参考 http://blog.sina.com.cn/s/blog_69c62b650100y53r.html

3.memset函数的使用。

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string>
 4 #include<memory.h>
 5 #include <math.h>
 6 using namespace std;
 7 
 8 #define MAX 10000000//比题目要求少一个0即可,加多一个0则内存溢出老是RE!
 9 bool prime[MAX+1]; //prime[i]=true表示i为素数
10 int PrimePalindromeList[100000]={0};
11 
12 void createPrimeList();
13 bool isPalindrome(int n);
14 void createPrimePalindromeList();
15 
16 int main(){
17     createPrimeList();
18     createPrimePalindromeList();
19     int a,b;
20     scanf("%d %d",&a,&b);
21     while(!(a==0&&b==0)){
22         int i=0;
23         while(PrimePalindromeList[i]<a){
24             i++;
25         }
26         while(PrimePalindromeList[i]<=b&&PrimePalindromeList[i]!=0){
27             printf("%d\n",PrimePalindromeList[i]);
28             i++;
29         }
30         scanf("%d %d",&a,&b);
31     }
32     return 0;
33 }
34 
35 void createPrimeList(){
36     memset(prime,true,sizeof(prime)); //将元素初始化为true
37     prime[1]=false;
38     for(int i=2;i<=sqrt(MAX);i++){ //小素数的倍数都不是素数
39         if(prime[i]){
40             for(int j=i*2;j<=MAX;j+=i)
41                 prime[j]=false;
42         }
43     }
44 }
45 bool isPalindrome(int n){
46     int origin=n,reverse=0;
47     int temp;
48     while(n!=0){
49         temp=n%10; //取最后一位数
50         n/=10;
51         reverse=reverse*10+temp;
52     }
53     if(origin==reverse)
54         return true;
55     else
56         return false;
57 }
58 void createPrimePalindromeList(){
59     int count=0;
60     for(int i=5;i<=MAX;i++){ //选出是回文数的素数存进数组中
61         if(prime[i]){
62             if(isPalindrome(i)){
63                 PrimePalindromeList[count]=i;
64                 count++;
65             }
66         }
67     }
68 }

 

 

 

 附:筛选法求素数步骤
 

1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.
2.然后:
      for( i=3; i<=sqrt(n); i+=2 )
      {   if(prime[])
          for( j=i+i; j<=n; j+=i )prime[j]=false;
      }
3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。
原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质
数的倍数筛掉。
    一个简单的筛素数的过程:n=30。
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
   
    第 1 步过后2 4 ... 28 30这15个单元被标成false,其余为true。
    第 2 步开始:
     i=3;  由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false.
     i=4;  由于prime[4]=false,不在继续筛法步骤。
     i=5;  由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false.
     i=6>sqrt(30)算法结束。
    第 3 步把prime[]值为true的下标输出来:
     for(i=2; i<=30; i++)
     if(prime) printf("%d ",i);
    结果是 2 3 5 7 11 13 17 19 23 29

 

 

 

 

 

 

转载于:https://www.cnblogs.com/jolin123/p/3328870.html

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
标题基于SpringBoot的学生学习成果管理平台研究AI更换标题第1章引言介绍研究背景、目的、意义以及论文结构。1.1研究背景与目的阐述学生学习成果管理的重要性及SpringBoot技术的优势。1.2研究意义分析该平台对学生、教师及教育机构的意义。1.3论文方法与结构简要介绍论文的研究方法和整体结构。第2章相关理论与技术概述SpringBoot框架、学习成果管理理论及相关技术。2.1SpringBoot框架简介介绍SpringBoot的基本概念、特点及应用领域。2.2学习成果管理理论基础阐述学习成果管理的核心理论和发展趋势。2.3相关技术分析分析平台开发所涉及的关键技术,如数据库、前端技术等。第3章平台需求分析与设计详细分析平台需求,并设计整体架构及功能模块。3.1需求分析从学生、教师、管理员等角度对平台需求进行深入分析。3.2整体架构设计设计平台的整体架构,包括技术架构和逻辑架构。3.3功能模块设计具体设计平台的核心功能模块,如成果展示、数据分析等。第4章平台实现与测试阐述平台的实现过程,并进行功能测试与性能分析。4.1平台实现详细介绍平台的开发环境、关键代码实现及技术难点解决方案。4.2功能测试对平台各项功能进行全面测试,确保功能正确无误。4.3性能分析分析平台的性能指标,如响应时间、并发处理能力等。第5章平台应用与效果评估探讨平台在实际教学中的应用,并对其效果进行评估。5.1平台应用案例选取典型应用案例,展示平台在实际教学中的使用情况。5.2效果评估方法介绍平台效果评估的具体方法和指标。5.3评估结果分析根据评估数据,对平台的应用效果进行深入分析。第6章结论与展望总结论文的主要研究成果,并指出未来研究方向。6.1研究结论概括性地阐述论文的研究结论和主要贡献。6.2研究展望针对当前研究的不足之处,提出未来改进和扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值