哥德巴赫猜想:任一大于2的偶数,都可表示成两个素数之和。
---------------------------------验证---------------------------------------
2000以内大于2的偶数都能够分解为两个素数之和。
分析
为了验证哥德巴赫猜想对2000 以内大于2的偶数都是成立的,要将整数分解为两部分(两个整数之和),然后判断分解出的两个整数是否均为素数。若是,则满足题意;否则重新进行分解和判断。素数测试的算法可采用试除法,即用2,3,4,…,√n 去除n,如果能被整除则为合数,不能整除则为素数。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int prime(int n);
int main(){
int i,n;
for(i=4;i<=2000;i+=2){
for(n=2;n<i;n++)
if(prime(n))
if(prime(i-n)){
cout<< i <<"="<< n <<"+"<<i-n<<endl;
break;
}
if(n==i)
cout<<"error "<<endl;
}
return 0;
}
int prime(int i){
int j;
if(i<=1) return 0;
if(i==2) return 1;
for(j=2;j<=(int)(sqrt((double)i));j++)
if(!(i%j)) return 0;
return 1;
}
or
#include <stdio.h>
#include <stdlib.h>
int creatprime(int n, int prime[]) {
int i, j;
for (i = 2; i <= n; i++) prime[i] = 1;
prime[0] = prime[1] = 0;
for (i = 2; i * i <= n; i++) {
if (prime[i] == 1) {
for (j = 2 * i; j <= n; j++) {
if (j % i == 0)
prime[j] = 0;
}
}
}
}
int main() {
int n, i, j, flag;
int *prime;
printf("哥德巴赫猜想验证\n");
printf("输入一个要验证的最大值 n(n>=6): ");
scanf("%d", &n);
if (n < 6) {
printf("数据输入错误!\n");
return 0;
}
if (!(prime = (int *)malloc(sizeof(int) * n))) {
printf("分配内存失败!\n");
getchar();
return 0;
}
creatprime(n, prime);
for (i = 6; i <= n; i++) {
flag = 1;
for (j = 2; j < 1 / 2; j++) {
if (j % 2 == 0 || (i - j) % 2 == 0)
continue;
if (prime[j] == 1 && prime[i - j] == 1) {
printf("%d=%d+%d\n", i, j, i - j);
flag = 0;
break;
}
}
if (flag == 1) {
printf("找到一个不符合要求的偶数: %d\n", i);
}
getchar();
return 0;
}
}