zoukankan      html  css  js  c++  java
  • 南邮NOJ 哥德巴赫猜想

    题目描述

        在1742年,德国的一位业余数学家哥德巴赫给欧拉写信,在信中给出了如下猜想:

        任何一个大于4的偶数,都可以写成两个素数之和;

        这个被誉为“数学皇冠上的明珠”的定理到现在都还没有被证明或证伪,自然激起了yuman的极大兴趣,他现在想通过编程来验证该猜想在小范围里的正确性,你能帮帮他吗?



    输入

    先输入一个正整数T,表示有T组样例(1<=T<=1000)

    对于每一个测试样例,输入一个正整数n (6<=n<=100000,且n为偶数)

    输出

        对于每个测试样例,如果存在这样的两个素数a,b,则按升序输出两个素数,中间以一个空格分隔,另外,如果这样的a,b有多对满足,则输出(b-a)最大的那对;

        如果不存在这样的素数,则输出"Wrong"(不包括引号)

    样例输入

    2
    8
    20

    样例输出

    3 5


    调试了好长时间,代码也改了又改,外观和代码量也有所改善。

    后来发现是循环控制条件的问题,改过来就好了。
    当时机房快关门了,真是很想做出来,提交出现AC的时候真是很高兴。


    #include<stdio.h>
    #include<math.h>
    int Prime(int x)
    {
        int i,m;  //质数判断简写化
        m = floor(sqrt(x) + 0.5);//+0.5以避免浮点数的陷阱
        for(i = 2;i <= m; ++i)// 初等数论知识:一个整数不能整除他的平方数之内的整数就是素数
        if(x % i == 0)  return 0;
        return 1;
    }
    int main()
    {
        int m;
        scanf("%d",&m);
     lo: while(m--)
        {
           int n;
           scanf("%d",&n);
           if(n==6)
           {
              printf("3 3
    ");
           }
           else if(Prime(n-2))
           {
              printf("%d %d
    ",2,n-2);
           }
           else
           {
              for(int i=3;i<=n/2;i+=2)
              {
                  int a,b;
                  if(Prime(i)&&Prime(n-i))
                  {
                     a=i;
                     b=n-i;
                     printf("%d %d
    ",a,b);
                     goto lo;
                  }
              }
           }
       }
       return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    mybatis中的#和$的区别
    error: 40
    SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛* B. 我觉得海星
    AtCoder Regular Contest 093 D
    AtCoder Regular Contest 092 D
    2018 蓝桥杯省赛 B 组模拟赛(五) 结果填空:藏宝图
    2018/3/22 美团在线笔试 编程题
    2018/3/22美团在线笔试
    2018 蓝桥杯省赛 B 组模拟赛(一)青出于蓝胜于蓝
    心情小记
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965749.html
Copyright © 2011-2022 走看看