【发布时间】:2016-09-26 10:59:44
【问题描述】:
我在 USACO 培训中解决了这个关于在极限之间生成素数回文的问题。我在最后引用了问题记录。我通过生成低于上限的所有奇数回文并检查每个打印它们的素数来解决它。解决方案通过了评分器,但有没有比我的菜鸟生成所有并检查东西更有效的方法(因为我真的希望在竞争性编程中学习更有效的策略)。
数字 151 是质数回文数,因为它既是质数又是回文数(向前读和向后读时是同一个数字)。编写一个程序,找出两个提供的数字 a 和 b (5
程序名称:pprime
输入格式
第 1 行:两个整数,a 和 b 样本输入(文件 pprime.in)
5 500
输出格式
按数字顺序排列的回文素数列表,每行一个。 样本输出(文件 pprime.out)
5
7
11
101
131
151
181
191
313
353
373
383
我想我也应该提供我的算法来获取输出
Step 1. Take Input a and b
Step 2. Initialise a list of odd palindromes op
Step 3. Add 5, 7 and 11 to op
Step 4. Generate all the 3,5,7 digit odd palindromes and add to op
Step 5. Check for every element e of op
Step 5.1. If e>=a and e<=b
Step 5.1.1. If e is PRIME print e
Terminate the loop otherwise
如果上限更大,这个过程显然会失败,因此我正在寻找更有效的解决方案。
编辑:我以通常的方式检查素数,如
Given the number I've to check for prime is n.
if (n==1) return false;
if (n==2) return true;
for (int i = 2; i <= sqrt(n); ++i)
if (n%i == 0) return false;
return true;
【问题讨论】:
-
如何检查素数?使用筛子,还是每次都从头开始?
-
我将 5,7,11 推入一个数组,然后生成所有 3、5 和 7 位奇数回文数,检查每个数字的素数,因为我认为这个数字远小于可能的素数数量有可能。
-
是的,但是您如何检查素数?另外,请注意回文可以有一个均匀的长度,例如7227.
-
我不生成任何偶数长度的回文,因为它们中的每一个都是11的倍数(因此它不能是素数)
-
没有意识到这一点。聪明的! :)
标签: c++ optimization palindrome memory-efficient