• openjudge 1.13.11 回文素数


    OpenJudge - 11:回文素数


    解题思路(70分):

    1.由于数据量比较大,所以采用埃式筛选法来筛选素数

    2.确定最小值和最大值,min=pow(10,n-1),max=pow(10,n)

    3.依次枚举,如果是回文数并且是素数的话,计数器累加,存入数组

    4.输出计数器和各个回文素数


    1. #include
    2. using namespace std;
    3. bool a[1000000005];//埃式筛选法求素数
    4. int num[10000000];//存回文素数数组
    5. bool check(int x)//判断是否为回文数
    6. {
    7. int m=x,count=0;
    8. while(m!=0)
    9. {
    10. count=count*10+m%10;
    11. m=m/10;
    12. }
    13. if(count==x)
    14. return true;
    15. else
    16. return false;
    17. }
    18. int main()
    19. {
    20. int n,sum=0,k=0;
    21. a[1]=1;
    22. cin>>n;
    23. int min=pow(10,n-1);//确定最小值
    24. int max=pow(10,n);//确定最大值
    25. for(int i=2;i<=max;i++)
    26. {
    27. if(a[i]==0)
    28. for(int j=2;j*i<=max;j++)
    29. a[i*j]=1;
    30. }//埃式筛选法求素数
    31. for(int i=min;i
    32. {
    33. if(check(i)&&a[i]==0)//如果这个数是质数并且是回文数
    34. {
    35. sum++;//计数器累加
    36. num[++k]=i;//将该数存入数组
    37. }
    38. }
    39. cout<//输出回文素数的个数
    40. for(int i=1;i<=k;i++)//依次输出这些数
    41. cout<" ";
    42. return 0;
    43. }

    优化思路(100分):

    1.当数据量比较大的时候,很明显挨个判断是否为回文数也会超时,该如何优化呢?

       重点:在素数领域有一个性质,偶数位数的除了11以外全部不是回文素数

    2.那么只需要对n为1和2的时候进行特判,n为1的时候,回文素数有4个分别是2,3,5,7,当n为2的时候,只有1个回文素数是11

    3.当输入的n为偶数的时候,直接输出0即可

    4.当n为奇数的时候,为了缩短时间,可以采用构造回文数的方法,构造回文数中,如果前n/2-1位确定了,那么可以使用累加版数位分离的方法补齐另一半,然后再对构造好的回文数判断是否是素数,即可缩短时间


    1. #include
    2. using namespace std;
    3. long long a[50000];
    4. bool check1(int x)//检验是否为素数
    5. {
    6. for(int i=2;i<=sqrt(x);i++)
    7. if(x%i==0)
    8. return false;
    9. return true;
    10. }
    11. int build(int x)//构造回文数,例如123返回了12321
    12. {
    13. int temp=x;
    14. x=x/10;
    15. while(x!=0)
    16. {
    17. temp=temp*10+x%10;
    18. x=x/10;
    19. }
    20. return temp;
    21. }
    22. int main()
    23. {
    24. int n,k=0;
    25. cin>>n;
    26. if(n==1)//对于1和2进行特判
    27. {
    28. cout<<4<2<<" "<<3<<" "<<5<<" "<<7;
    29. return 0;
    30. }
    31. else if(n==2)
    32. {
    33. cout<<1<11;
    34. return 0;
    35. }
    36. else if(n%2==0)//偶数位数的所有数都不是回文素数,11除外
    37. {
    38. cout<<0;
    39. return 0;
    40. }
    41. else
    42. {
    43. int min=pow(10,(n+1)/2-1);
    44. int max=min*10;
    45. for(int i=min;i
    46. {
    47. int num=build(i);
    48. if(check1(num))
    49. a[++k]=num;
    50. }
    51. }
    52. cout<
    53. for(int i=1;i<=k;i++)
    54. cout<" ";
    55. return 0;
    56. }

  • 相关阅读:
    Java并发编程学习笔记5——共享模型之无锁
    使用todesk或者向日葵远程Ubuntu22.04系统的客户机黑屏
    [架构之路-223]:数据管理能力成熟度评估模型DCMM简介
    [100天算法】-键值映射(day 42)
    ES 未分片 导致集群状态飘红
    代数科学计算:LiveMath Maker v3.6.0 cRACK
    千人虚拟社交体验,多人元宇宙场景真的可行么?
    【Arma3脚本教程】一、基本介绍
    SD卡格式化如何恢复数据?
    无服务器的无状态性
  • 原文地址:https://blog.csdn.net/weixin_60869516/article/details/126432819