我最近问了一个有关查找数字是否为基数为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;
}
答案 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;
}
我如何找到错误: