Bailian3143 验证“歌德巴赫猜想”【筛选法】

tech2025-01-06  8

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; }
最新回复(0)