C++寻找下一个素数回文

标签 c++ palindrome

<分区>

这是真正的问题

https://www.codechef.com/problems/PRPALIN/

以下代码适用于所有输入,但输入 900000 时执行时间为 1.125 秒。我如何优化代码?如何改进代码?

非常感谢任何帮助。谢谢你! :)

#include <iostream>
#include <cmath>
#include <cassert>
#include <ctime>

clock_t start=clock();

long long a;

inline long long next_prime();
inline bool palindrome();


int main()
{
    freopen("in.txt","r",stdin);
    scanf("%ld", &a);
    assert(1 <= a <= 1000000);
    do
        a = next_prime();   
    while(!palindrome());
    printf("%ld\n",a);
    fprintf(stderr,"time=%.3lfsec\n",0.001*(clock()-start));

    return 0;
}

long long next_prime()
{
    long long num = a;
    num++;

    while(1)
    {
        int flag = 0;
        long long i;    
        long long z = sqrt(num);

        for(i = 2; i <= z; i++)
            if((num % i) == 0)
                flag = 1;       
        if(flag == 0)
            return num;
        else
        num++;
    } 
}

bool palindrome()
{
    long long reverse_num = 0;
    long long temp = a;
    while(temp != 0)
    {
        reverse_num = reverse_num * 10;
        reverse_num = reverse_num + temp % 10;
        temp = temp/10;
    }
    if(a == reverse_num)
       return true;
    else
       return false;
}

最佳答案

您可以使用以下算法优化检测质数函数。

创建一个从 2 到 n 的连续整数列表:(2, 3, 4, ..., n)。 最初,令 p 等于 2,即第一个质数。

从 p 开始,通过以 p 为增量计数到 n 来枚举它的倍数,并在列表中标记它们(这些将是 2p、3p、4p、...;p 本身不应被标记)。

在列表中找到第一个大于 p 的没有标记的数。如果没有这样的数字,停止。否则,让 p 现在等于这个新数(这是下一个质数),并从步骤 3 开始重复。

检查此链接,http://www.algolist.net/Algorithms/Number_theoretic/Sieve_of_Eratosthenes

至于回文检查,目前是 O(n),我想不出任何改进的方法。

关于C++寻找下一个素数回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707949/

相关文章:

java - 循环和堆栈,回文家庭作业

c++:使用throw,try and catch

c++ - 以 0 开头的 int 发生了什么?前 00101

c++ - 错误 C2059 : 'constant' when trying to create a Qt container in a header file with known size

c - 为什么这个检查一行是否是回文的程序会返回段错误?

c - 找到第一个回文单词的开头

c - 回文C程序大写字母转小写字母

c++ - OpenCV inRange() 函数

c++ - ncurses clear() 导致闪烁

使用堆栈检查字符串是否为回文