P1217 [USACO1.5]回文质数 Prime Palindromes

Posted lijiahui-123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1217 [USACO1.5]回文质数 Prime Palindromes相关的知识,希望对你有一定的参考价值。

题解:

第一次:

算法复杂度过高,导致编译超时,需要优化

#include<stdio.h>
#include<math.h>
int a[100000001] = { 0 };
int p(int n) {
 int t = n, ret = 0;
 while (t > 0) {
  t /= 10;
  ret++;
 }
 if (ret == 1) {
  printf("%d ", n);
  return 0;
 }
 t = ret;
 t /= 2;
 ret -= 1;
 
 while (n > 0 && t > 0) {
  int a=n /pow(10, ret);
  if (n % 10 == a ) {
   n %= (int)pow(10, ret);
   n /=10;
   ret -= 2;
   t--;
  }
  else {
   return 0;
  }
 }
 return 1;
}
int main()
{
 int A, B, i, j;
 scanf("%d %d", &A, &B);
 
 //0:质数,1:合数
 for (i = 2; i < sqrt(B); i++) {
  for (j = i+1; j <= B; j++) {
   if (j % i == 0 && a[j] == 0) {
    a[j] = 1;
   }
  }
 }
 for (i = A; i <= B; i++) {
  if ( a[i] == 0&&p(i)) {
   printf("%d ", i);
  }
 }
 return 0;
}
 
 自己的尝试还是差最大的数据:
for (j = 6; j < 10000000; j += 2) {
  a[j] = 1;
 }
 for (i = 3; i <3163; i+=2) {    //sqrt()
  for (j = i*2; j <= 10000000; j+=i) {
   if ( a[j] == 0) {
    a[j] = 1;
   }
  }
 }
 
 
看了题解后:
1.我认为简单的判断回文数的代码:
bool pd_h(int x)
{

    int y=x,num=0;//int y=x,防止x被改变
    while (y!=0)
    {
        num=num*10+y%10;//上一次数字的记录进位再加上下一位数
        y/=10;
    }
    if (num==x) return 1;
    else return 0;
}
 

2.你会发现,6同时被2和3各筛了一次。它在计算时就被访问了两次,这样会导致效率低下。

原理:对于任意合数,必定可以有最小质因子乘以最大因子的分解方式。因此,对于每个合数,只要用最大因子筛一遍,枚举时只要枚举最小质因子即可。

int vis[MAXN];
int prime[MAXN];
void Prime()
{
    int cnt=0;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) prime[cnt++]=i;
        for(int j=0;j<cnt&&i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=i;
            if(i%prime[j]==0) break;
        }
    }
}

以上是关于P1217 [USACO1.5]回文质数 Prime Palindromes的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

题解 P1217 [USACO1.5]回文质数 Prime Palindromes

Luogu p1217 [USACO1.5]回文质数 Prime Palindromes

洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes取回文数/数论/字符串

P1217 [USACO1.5]回文质数 Prime Palindromes

题解 P1217 [USACO1.5]回文质数 Prime Palindromes