• 【洛谷p1217】回文质数


    回文质数【题目链接】

    始终要记得凌云壮flag(真香)

    说是个搜索,其实感觉更像是一个暴力;


    这个题的难度并不是特别大,因为下面的提示太明显了qwq,(而且之前培训也讲过)首先是构造回文数,构造回文数时,有以下几点优化:

    优化1:对于一个回文数,若它的位数是偶数(1551,654456等),除11以外,其余所有的回文数都是11的倍数,所以在构造回文数时,只需要构造奇数位的回文数;

    优化2:因为回文数第一位等于最后一位(个位),所以只有当第一位是奇数时才有可能是质数,否则一定会是2的倍数;

    优化3:(其实不能算优化啦)对于5---100以内的数,既是回文数又是质数的只有5,7,11,因为我比较废,所以我是写出了三位回文数,五位回文数以及七位回文数这三种情况,然后因为数很多嘛,我们也不能全都枚举了(虽然好像也不会炸,亲测不会炸),反正就是不想多写两个for循环【吐舌】,然后在制造回文数的循环里加了两个判断语句;

    构造回文数代码:

    /*three*/
    for(int i=1;i<=9;i+=2)
         for(int j=0;j<=9;j++){
         if(i*100 + j*10 + i < a) continue;
             hw[++cnt] = i*100 + j*10 + i;
             if(hw[cnt] > b) {cnt--;break;}
           }
    
    /*five*/
    for (int d1 = 1; d1 <= 9; d1+=2)    
      for (int d2 = 0; d2 <= 9; d2++)
        for (int d3 = 0; d3 <= 9; d3++){
           if(10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1 < a) continue;
            hw[++cnt] = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
             if(hw[cnt] > b) {cnt--;break;}
          }
    
    /*seven*/
    for(int d1 = 1;d1 <= 9;d1 += 2)
       for(int d2 = 0;d2 <= 9;d2++)
         for(int d3 = 0;d3 <= 9;d3++)
           for(int d4 = 0;d4 <= 9;d4++){
         if(d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 + d1<a) continue;
             hw[++cnt] = d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 + d1;
         if(hw[cnt] > b) {cnt--;break;}
            }

    接下来在构造出的回文数中判断质数,直接写了一个O(√n)的素数判定就好啦;

    ac代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int a,b;
    int hw[10000010]={5,7,11},cnt=2,str;
    
    bool pri(int k){
        for(int i=2;i<=sqrt(k);i++)
          if(k%i==0) return 0;
        return 1;
    }
    
    int main(){
        scanf("%d %d",&a,&b);
        /*three*/
            for(int i=1;i<=9;i+=2)
              for(int j=0;j<=9;j++){
                   if(i*100 + j*10 + i < a) continue;//
                  hw[++cnt] = i*100 + j*10 + i;
                  if(hw[cnt] > b) {cnt--;break;}//
          }
            
        /*five*/
        for (int d1 = 1; d1 <= 9; d1+=2){    
          for (int d2 = 0; d2 <= 9; d2++){
             for (int d3 = 0; d3 <= 9; d3++){
               if(10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1 < a) continue;//
               hw[++cnt] = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
               if(hw[cnt] > b) {cnt--;break;}//
             }
          }
        }
            
        /*seven*/
        for(int d1 = 1;d1 <= 9;d1 += 2)
          for(int d2 = 0;d2 <= 9;d2++)
            for(int d3 = 0;d3 <= 9;d3++)
              for(int d4 = 0;d4 <= 9;d4++){
                  if(d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 + d1<a) continue;//
                  hw[++cnt] = d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 + d1;
                  if(hw[cnt] > b) {cnt--;break;}//
              }
              
        for(int i=0;i<3/*cnt*/;i++)
          if(hw[i]<a) str++;
        /*for(int i=cnt;i>=str;i--)
        if(hw[i]>b) cnt--;*/
        for(int i=str;i<=cnt;i++)
          if(pri(hw[i])) cout<<hw[i]<<endl;
    }//两种不同的写法看习惯吧

    end-

  • 相关阅读:
    看了一下unity5.6的新功能 以及Timeline
    摄像机旋转约束问题及解决
    MeshCollider双面化脚本
    js模块化历程
    用“MEAN”技术栈开发web应用(一)AngularJs前端架构
    简单一招实现json数据可视化
    基于zepto的移动端日期+时间选择插件
    我们的创业项目是如何夭折的
    前端资源预加载并展示进度条
    轻量级移动端日期选择器
  • 原文地址:https://www.cnblogs.com/zhuier-xquan/p/11001958.html
Copyright © 2020-2023  润新知