题目描述
在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\n");
}
else if(Prime(n-2))
{
printf("%d %d\n",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\n",a,b);
goto lo;
}
}
}
}
return 0;
}