3143:验证“歌德巴赫猜想”
总时间限制: 1000ms 内存限制: 65536kB
描述
验证“歌德巴赫猜想”,即:任意一个大于等于6的偶数均可表示成两个素数之和。
输入
输入只有一个正整数x。(x<=2000)
输出
如果x不是“大于等于6的偶数”,则输出一行:
Error!
否则输出这个数的所有分解形式,形式为:
x=y+z
其中x为待验证的数,y和z满足y+z=x,而且y<=z,y和z均是素数。
如果存在多组分解形式,则按照y的升序输出所有的分解,每行一个分解表达式。
注意输出不要有多余的空格。
样例输入
输入样例1:
7
输入样例2:
10
输入样例3:
100
样例输出
输出样例1:
Error!
输出样例2:
10=3+7
10=5+5
输出样例3:
100=3+97
100=11+89
100=17+83
100=29+71
100=41+59
100=47+53
来源
计算概论2007, XieDi
问题链接:Bailian3143 验证“歌德巴赫猜想”
问题简述:(略)
问题分析:验证“歌德巴赫猜想”问题。用筛选法求出素数备用是合适的,可以提高程序运行速度。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* Bailian3143 验证“歌德巴赫猜想” */
#include <bits/stdc++.h>
using namespace std;
const int N = 2000;
const int SQRTN = sqrt((double) N);
bool isprime[N + 1];
// Eratosthenes筛选法
void esieve(void)
{
memset(isprime, true, sizeof(isprime));
isprime[0] = isprime[1] = false;
for(int i = 2; i <= SQRTN; i++)
if(isprime[i]) {
for(int j = i * i; j <= N; j += i) //筛选
isprime[j] = false;
}
}
int main()
{
esieve();
int x;
scanf("%d", &x);
if(x < 6 || x % 2 != 0)
printf("Error!\n");
else {
for(int i = 2; i <= x / 2; i++)
if(isprime[i] && isprime[x - i])
printf("%d=%d+%d\n", x, i, x - i);
}
return 0;
}