
水题一道,就是判断自己是不是素数,然后按照对应进制反转再判断一次就完事了。
不过说起素数,今天偶然看见的应该是主流的素数判断方法,就是埃氏筛算法,算法的思想就是选择当前最小的素数,然后去掉所有它大于等于2倍的倍数,循环这个过程,最终可以得到所有素数。
我在做的时候也算利用了一下类似的思想,如果这个数不是2的倍数,那么在递增除数的时候就自加2而非自加1,这样能减少一半的遍历量。
总之,下面就是代码了
#include <stdio.h>
int count(int r, int n)
{
int res = 1;
for(int i=0;i<n;i++)
res *= r;
return res;
}
int reverse(int num, int r)
{
int temp[20];
int m = 0;
int res = 0;
for(int i=0;i<20;i++)
{
if(num<r)
{
temp[i] = num;
break;
}
else
{
temp[i] = num % r;
num = num / r;
m++;
}
}
for(int i=0;i<m+1;i++)
{
res += temp[i] * count(r, m-i);
}
return res;
}
int prime(int n)
{
if (n==1)
return 0;
if(n==2)
return 1;
if(n%2==0)
return 0;
for(int i=3;i<=n/2;i+=2)
{
if(n % i == 0)
return 0;
}
return 1;
}
int main()
{
int input[9000][2];
int c;
for(c=0;c<9000;c++)
{
scanf("%d", &input[c][0]);
if(input[c][0]<0)
break;
scanf("%d", &input[c][1]);
}
for(int i=0;i<c;i++)
{
if(prime(input[i][0]) == 0)
{
printf("No\n");
continue;
}
if(prime(reverse(input[i][0], input[i][1])) == 1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
这篇博客介绍了一道简单的PAT题目,涉及判断素数并检查其在反转后的数值是否仍为素数。博主提到了埃氏筛算法,并分享了自己的解决方案,通过跳过偶数避免不必要的遍历,从而优化了算法效率。
964

被折叠的 条评论
为什么被折叠?



