//何为哥德巴赫猜想?且看我维基百科的结果
“ | 任一大于2的偶数,都可表示成两个素数之和。 | ” |
这个猜想与当时欧洲数论学家讨论的整数分拆问题有一定联系。整数分拆问题是一类讨论“是否能将整数分拆为某些拥有特定性质的数的和”的问题,比如能否将所有整数都分拆为若干个完全平方数之和,或者若干个完全立方数的和等。而将一个给定的偶数分拆成两个素数之和,则被称之为此数的哥德巴赫分拆。例如,
4 = 2 + 2
6 = 3 + 3
8 = 3 + 5
10 = 3 + 7 = 5 + 5
12 = 5 + 7
14 = 3 + 11 = 7 + 7
…
换句话说,哥德巴赫猜想主张每个大于等于4的偶数都是哥德巴赫数——可表示成两个素数之和的数。
哥德巴赫猜想的大意:大于2的偶数都可以写成两个质数之和
#include<stdio.h>
#include<string.h>
#define MAX 1000000
int prime[MAX]; //声明为全局变量方便访问
void checkprime(int n); //用埃拉托色尼筛法找出素数 (详见https://blog.csdn.net/qq_45472866/article/details/104051475)
int main(){
int i, j, flag, cnt;
checkprime(MAX); /* 筛选出素数 */
cnt = 0;
for(i = 6; i <= MAX; i += 2){
flag = 1;
for(j = 2; j <= i / 2; j++)
if(prime[j] && prime[i - j]){ /* 判断两个和为i的数是不是都是素数 */
cnt++;
printf("%d + %d = %d%s", i - j, j, i, cnt % 5 ? " " : "\n");
flag = 0;
break;
}
if(flag) //flag != 0说明有一个偶数不符合
printf("有一个偶数不符合\n");
}
}
void checkprime(int n){
int i, j;
for(i = 0; i < n; i++)
prime[i] = 1;
for(i = 2; i * i <= n; i++)
if(prime[i])
for(j = i; j * i < n; j++)
prime[j * i] = 0;
}