查找以K为基础的回文数的第n个素数

时间:2018-10-24 17:24:26

标签: c algorithm palindrome

我最近问了一个有关查找数字是否为基数为K的回文问的问题,我得到了答案。 My Recent Question

现在我有一个更复杂的问题,我们将得到两个数字n和k,并且必须找到以K为底的回文数的第n个素数。

例如,如果我们得到8和10,我们有2 3 5 7 11 101 131 151,它们是回文数和素数,因此答案是151。另一个例子是4 2,我们分别有3 5 7 17 11 101 111 10001在基数2中是素数,在基数是回文,所以答案是17。

给出n和k使得答案最多为1E7。

我在法官系统中提交了程序,在某些情况下给出了错误的答案,在一种情况下还给出了时限错误。我不知道算法的哪一部分是错误的,哪一部分没有进行优化。

请注意,我不允许使用数组,向量和字符串,也不能使用超过stdio.h和math.h的库。这是我的程序,任何人都可以在其中找到任何问题:(我定义了intPow,因为数学中的pow函数会给出浮点数,有时会引起问题)

#include <stdio.h>
#include <math.h>
int primeCheck ( int n);
int palindrome ( int n,int base);
int digitCountBase (int n , int base);
int intPow (int a , int b);
int main()
{
    int n;
    int base;
    scanf("%d %d",&n,&base);
    int counter = 0;
    int i =2;
    int firstRound =1;
    while (counter!=n)
    {

        if (primeCheck(i))
        {
            if (palindrome (i,base))
            {
                counter++;
            }
        }
        if (counter ==n)
        {
            break;
        }
        if (firstRound)
        {
            i++;
            firstRound=0;
        }
        else{i+=2;}

    }
    printf("%d",i);
    return 0;
}
int primeCheck ( int n)
{
    if (n<2)
    {
        return 0;
    }
    if (n==4)
    {
        return 0;
    }
    else if (n<=5)
    {
        return 1;
    }

    if (n%2 ==0 || n%3 ==0 || n% 5 ==0)
    {

        return 0;
    }
     int i =5;
     int limit = sqrt(n)+2;
    for (int i =5;i<=limit;i+=6)
    {
        if (n%i==0||n%(i+2)==0)
        {
            return 0;
        }
    }
    return 1;
}

int palindrome ( int n,int base)
{
    int isTrue = 1;
    int digitCount = digitCountBase(n,base);

    int power = intPow(base,digitCount-1);
    while (n>0&& digitCount >0)
    {

        if (n%base != (n/power)&&digitCount!=1)
        {
            isTrue =0;
            return 0;

        }
        n = n- power;
        n=n/base;
        power = power /base;
        power = power /base;
        digitCount=digitCount-2;
    }

    return isTrue;

}
int digitCountBase (int n , int base)
{
    int digits=0;
    while (n)
    {
        digits++;
        n = n / base;
    }
return digits;

}

int intPow (int a , int b)
{
    int result = 1;
    for (int i=1;i<=b;i++)
    {
        result = result * a;
    }
    return result;


}

1 个答案:

答案 0 :(得分:2)

解决方案:将回文改变为

int palindrome ( int n,int base)
    {
        int isTrue = 1;
        int digitCount = digitCountBase(n,base);
        int power = intPow(base,digitCount-1);

        int original = n;
        while (n>0&& digitCount >0)
        {

            if (n%base != (original/power) % base &&digitCount!=1)
            {
                isTrue =0;
                return 0;

            }
            n=n/base;
            power = power /base;
            digitCount=digitCount-2;
        }

        return isTrue;

    }

我如何找到错误:

  • 您仅做两项事情,即素性测试和回文测试,因此检查它们是否工作正常是很有意义的。
  • 原始性测试非常容易,素数从1到10 ^ 7计数,并与google上的已知值进行比较。在这种情况下,这行得通
  • 要测试回文,请从Internet上选择一个可行的解决方案(即使您不能提交使用数组/字符串的解决方案,也可以对其进行测试!)。然后以一定的基数从1迭代到10 ^ 7,并检查两个函数是否返回相同的值。
  • 以3为底进行测试,很快发现56没有给出相同的输出。不正确的是你的。
  • 这就是修复您的功能的问题,您现在知道哪个是问题所在,甚至有一个示例说明其不起作用