虚空终端 • 1年前
每日刷题掉坑(114514/1) 在大部分人的潜意识里,质数远比回文数好筛,但真的是这样吗? 质数在剩余个数方面不赖,但是时间复杂度O(n)、O(sqrt(n))这样的大数字却经常被忽略 去掉2和5的倍数,剩下的回文数又有多少呢? 正是这个原因,使得这题的TLE率特别高(不排除我前面试了n多次) 外加一个查博客偶然所得的规律(见最后),代码就大功告成了
#include <cstdio>
#include <string>
int huiwen(int k)
{
int a[10],i=0,j;
while (k>0)
{
a[i]=k%10;
k/=10;
i++;
}
for (j=0; j<i; j++)
if (a[j]!=a[i-j-1])
return 0;
return 1;
}
int hwlength(int k)
{
int a[10],i=0;
while (k>0)
{
a[i]=k%10;
k/=10;
i++;
}
return (i);
}
int prime(int k)
{
int i;
for (i=3; i*i<=k; i+=2)
if (k%i==0)
return 0;
return 1;
}
int extend(int k)
{
int i,s=1;
for (i=0; i<k; i++)
s*=10;
return (s);
}
int main()
{
int a,b,i,j;
scanf("%d%d",&a,&b);
for (i=a; i<=b; i++)
{
if (i%2==0&&i!=2)
continue;
if (i%5==0&&i!=5)
continue;
if (!huiwen(i))
continue;
if (hwlength(i)%2==0&&i!=11)
{
i=extend(hwlength(i));
continue;
}
if (prime(i))
printf("%d\n",i);
}
return 0;
}
规律:任何长度为偶数的回文数字都是合数(除了11) 所以判断出来以后直接强行加一位就能省掉很多的时间
评论:
请先登录,才能进行评论