C 求以K为底的第n个回文素数

C 求以K为底的第n个回文素数,c,algorithm,palindrome,C,Algorithm,Palindrome,我最近问了一个问题,关于找出一个数字是否是以K为底的回文,我得到了答案。 现在我有一个更复杂的问题,我们将得到两个数字n和k,我们必须找到以k为底的第n个素数 例如,如果我们得到8和10,我们有2 3 5 7 11 101 131 151,它们是回文和素数,所以答案是151。另一个例子是42,我们在基数2中分别有3 5 7 17 11 101 111 10001,它们在基数中是素数和回文,所以答案是17 n和k的给定使得答案最多为1E7 我在一个法官系统中提交了我的程序,它在一些案件中给出了错

我最近问了一个问题,关于找出一个数字是否是以K为底的回文,我得到了答案。

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

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

n和k的给定使得答案最多为1E7

我在一个法官系统中提交了我的程序,它在一些案件中给出了错误的答案,在一个案件中也给出了时限错误。我不知道我的算法的哪一部分是错误的,哪一部分没有得到优化

请注意,我不允许使用数组、向量和字符串,而且我不能使用超过stdio.h和math.h的库。这是我的程序,有人能在其中找到问题吗:(我定义intPow是因为数学中的pow函数给出了一个浮点,有时它会导致问题)

#包括
#包括
int-primeCheck(int-n);
int回文(int-n,int-base);
int-digitCountBase(int-n,int-base);
int intPow(INTA,INTB);
int main()
{
int n;
int-base;
scanf(“%d%d”,&n,&base);
int计数器=0;
int i=2;
int firstRound=1;
while(计数器!=n)
{
如果(检查(i))
{
if(回文(i,基))
{
计数器++;
}
}
如果(计数器==n)
{
打破
}
如果(第一轮)
{
i++;
第一轮=0;
}
else{i+=2;}
}
printf(“%d”,i);
返回0;
}
整数预检查(整数n)
{

如果(n解决方案:将回文改为

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,并检查两个函数是否返回相同的结果
  • 用base 3测试时,很快发现56的输出不一样。错误的是你的
  • 然后是修复函数的问题,现在你知道哪一个是问题所在,甚至有一个例子说明它在哪里不起作用

这些问题的问题是“我向法官系统提交了我的代码,法官系统说答案是错误的”,我们不知道测试用例是什么,预期输出是什么,或者实际输出是什么。在提出“为什么我的代码不工作?”时,通常需要所有这些问题问题。我会要求OP运行一些测试,并试图找出一些错误答案。在线评委的编程挑战要求你找到一个有效的算法。循环所有数字,然后检查回文和素数不是很有效。尝试找到一种生成回文,然后检查素数的方法(反之亦然)。此外,这些问题通常会告诉您可能输入的范围。Yu可以在这里分享它们,这样我们就可以看到您是否遇到了数字溢出。@M Oehm我不知道测试用例。只知道基数是从2到20。除了最终答案不会超过1E7外,什么都不知道。我认为这个问题有4秒的时间限制。我从0到1E7的整个primecheck都是在我的电脑中在1.4秒内完成的。@user3386109我说我不能在代码前的注释中使用数组。如果允许使用数组,会简单得多。如果我使用数组、字符串或向量,法官会给出运行时错误,因为问题的主要目的是算法。提示:回文(56,3)给出错误答案问题出在101111上。我的方法忽略了0,但是你的方法很好。非常感谢。
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;

    }