南邮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;
}

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

原文地址:https://www.cnblogs.com/Tobyuyu/p/4965752.html