【问题标题】:Is there a more efficient way to generate Palindromes which are prime if the bounds are large?如果边界很大,是否有更有效的方法来生成素数回文?
【发布时间】: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


【解决方案1】:

实际上,您检查素数的方式对于小数非常有效,对于检查较大数的素数,您可以使用素数测试,例如 Rabin Miller 和 Baillie-PSW(BPSW 或 BSW)素数测试。问题是,这些算法看起来真的很神奇,我什至从未尝试过了解它们的工作原理和原因,但它们确实工作得很好!使用后者,我已经能够生成一个 320 位数的素数。您可以轻松地在线找到这些算法的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2013-05-03
    相关资源
    最近更新 更多