• 哥德巴赫猜想


    哥德巴赫猜想

    题目背景

    哥德巴赫猜想是世界近代三大数学难题之一。至今还未被成功证明。

    题目描述

    虽然哥德巴赫猜想尚未被成功证明,但是这个猜想目前在计算机处理能力范围内是成立的。

    哥德巴赫猜想可以描述为:任意一个大于2的偶数都可以写成两个质数之和

    因此,你也来设计一个程序,将给定的大于2的偶数a拆分成两个质数之和。(有多种拆分方案时,输出较小的加数相比其他拆分方法最小的方案)

    输入格式

    第一行一个整数q

    接下来的q行,每行一个偶数a

    输出格式

    q行,每行对应一次询问的答案

    样例数据
    样例输入1
    1. 5
    2. 4
    3. 6
    4. 888
    5. 890
    6. 892
    样例输出1
    1. 2 2
    2. 3 3
    3. 5 883
    4. 3 887
    5. 5 887
    数据范围

    对于100%的数据,4≤a≤10^5,1≤q≤10^4


    思路:

    我是没有什么好办法,因为数据范围只到100000,所以我先把100000以内的质数先全找出来,然后在输入a的时候,遍历所有的质数,判断这个质数是不是a的分解方案(两个质数,加起来等于a)的其中一个数,比如,我们定义一个变量c,c=a-当前遍历到的质数;,如果c是质数,那我们就直接输出(因为我们确定当前遍历到的质数是质数,所以只要判断c就好了)

    思路还是很简单的,就是暴力


    代码:

    1. #include
    2. using namespace std;
    3. int zz(long long a){//判断质数
    4. if(a==1)return 0;
    5. for(int i=2;i<=sqrt(a);i++)
    6. if(a%i==0)return 0;
    7. return 1;
    8. }
    9. int main(){
    10. long long maaa[100000],b[100000],cnt=0,q,a,c;
    11. for(int i=2;i<=100000;i++){//埃式筛法,把100000以内的质数全存在数组b里面
    12. if(maaa[i]==0){
    13. b[++cnt]=i;
    14. for(long long j=2*i;j<=100000;j+=i)
    15. maaa[j]=1;
    16. }
    17. }
    18. cin>>q;//读入
    19. for(int i=1;i<=q;i++){
    20. cin>>a;//读入
    21. for(int i=1;i<=cnt;i++){//一共有cnt个质数,这里就是遍历,找a能分成那两个质数
    22. c=a-b[i];//b[i]为a分成的第一个质数,那c就是a分成的第二个质数
    23. if(zz(c)){//a=b[i]+c,如果c也是质数,那就输出
    24. cout<" "<
    25. break;//输出了就不用找了直接结束
    26. }
    27. }
    28. }
    29. return 0;
    30. }

    不知道有没有更高效的方法,有人知道吗?


    拓展:

    不知道什么是埃式筛法的看这里:点我

    不会判断质数的看这里(真的有人不会吗):点我

  • 相关阅读:
    Centos7下安装Oracle11g
    记录链接方法概述总结
    复盘:什么是秋招提前批?什么是普通秋招?都是招聘,为啥要设置这两个招聘时间段
    MyBatis篇---第二篇
    渗透工具-白帽安全工程师Kali linux系统
    dpi是什么意思
    Windows Open3D 0.16.0版本编译
    代码规范常见错误
    bug:XShell无法连接CentOS虚拟机
    Python语义分割与街景识别(2):环境搭建
  • 原文地址:https://blog.csdn.net/ptyz306/article/details/132717786