【问题标题】:Prime Palindrome Logic Efficiency素数回文逻辑效率
【发布时间】:2013-04-16 19:58:29
【问题描述】:

我写了一个代码来获取前 1000 个素数回文,虽然我的逻辑是正确的,但我似乎没有得到前 1000 个素数回文,我得到了一些 113 个素数回文,之后我没有得到任何。我认为这是因为我的逻辑不够高效,这就是为什么编译需要这么多时间的原因,但是我已经尝试了三种不同的方法,并且每次运行时在第 113 个素数回文数之后都卡住了。

谁能解释一下为什么我会遇到这个问题,是因为代码效率不高吗?

/* Program to find the first 1000 prime palindromes */

#include<stdio.h>
#include<math.h>


int prime(long int n)
{
    int i,check=0;

    if(n!=2 && n%2==0)
        return 0;

    if(n==2 || n==3)
        return 1;

    for(i=3;i<n/2;i=i+2)
        if(n%i==0)
        check++;

    if(check==0)
      return 1;
    else
    return 0;
}

/*long int reverse_number(long int n,long int partial)
{
if(n==0)
    return partial;
else
    return reverse_number(n/10,partial*10 + n%10);
}*/

int palindrome(long int n)
{
    long int reverse = 0;
    long int n_copy = n;
    int rem;
    while(n_copy!=0)
    {
    rem = n_copy%10;
    reverse = reverse*10;
    reverse = reverse + rem;
    n_copy = n_copy/10;
    }

    if(reverse==n)
    return 1;
    else
    return 0;

} 


int main()
{
    long int i;
    int count=5,digits;


    printf("The 1000 prime palindromes are: \n");
    printf("1. 2\n2. 3\n3. 5\n4. 7\n");

    for(i=11;;i=i+2)
    {
        if(prime(i))
        {
            if(palindrome(i))
            {
                printf("%d. %ld\n",count,i);
                count++;
            }
            /*if(reverse_number(i,0)==i)
            {
            printf("%d. %ld\n",count,i);
            count++;

            }*/

        }
        if(count==50)
          break;
    }



    printf("\n\n");

    return 0;

}

【问题讨论】:

  • 没有机会查看这些数字的大小,但我敢打赌你有某种溢出错误。一个有符号的 long int 在 C 中通常是 32 位,所以你可以达到 2^31-1,或约 20 亿。任何比这更大的东西都会溢出,并可能导致无法预料的问题。
  • i
  • @Greg 这里没有溢出,主要回文并不罕见。这也是我的第一个怀疑。

标签: c palindrome


【解决方案1】:

让我在这里引用我的命令式编程教授的话:“您可以检查数字是否是素数和回文,或者检查它是否是回文和素数......”

另外,当count 为 50 时,您正在 break 循环,我想您想在它为 1000 时执行此操作。

如果不编辑 primepalindrome 函数,除了调用它们的顺序之外,我的电脑在 781 9989899 之后停止查找更多内容。

【讨论】:

  • 这就是答案。此外,直接生成回文是有意义的(从 1 到 n 循环,并且对于每个数字,将其反转并将两半粘合在一起,然后在移除中间数字的情况下重复),并且在素性测试中,当找到了一个因子。
  • 它不会停止,只会变慢。下一个素数回文是 100030001,由于素数测试是素数 p 的 Theta(p),因此需要相当长的时间才能达到。
  • 啊,是的,它并没有真正停止,它实际上还在运行。 (:
  • 如果您不将质数测试更改为在平方根处停止,它将运行几天才能找到那个。如果你停在平方根处,几秒钟就到 1000。
猜你喜欢
  • 1970-01-01
  • 2015-05-04
  • 2013-10-08
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多