问题:2000以内的不小于4的正偶数都能够分解为两个素数之和。
用C语言实现。
逐个判断,一起输出(不使用表)
#include<stdio.h>
#include<stdlib.h>
int main() {
void fun(int);
int i;
printf("请输入要验证的范围:");
scanf("%d",&i);
fun(i);
return 0;
}
void fun(int n){ //验证函数
int proving(int);
int x_1,x_2,flag;
for( int x = 4;x<n;x++,x++){ //寻找这范围n内,正偶数x的素数之和
for(x_1 = 2; x_1<=x/2; x_1++){ //证明对于x是否为两个素数和
flag = proving(x_1); //证明x_1是素数
if(flag == 1){
x_2 = x - x_1;
flag = proving(x_2); //验证x_2是否为素数
if(flag==1){
printf("%d = %d+%d ",x,x_1,x_2 );
}
}
}
}
}
int proving(int n){ //素数判断,是则返回1,否为0
if(n==2||n==3){
return 1;
}
for(int i=2;i<=n/2;i++){ //因为当一个大于4的数;尝试除于小于它的一半的自然数(1,0除外),而余数还未为零,即i一直加到n/2,可以认为为素数。
if(n%i==0){
return 0; //for中途为零,则n非素数。
}
}
return 1;
}
另一种是打表方式,逐个判断,逐个输出。即先将一定范围的素数全识别出来,再判断。复杂度更低。
#include<stdio.h>
#include<stdlib.h>
int a[65536]={0};
int main() {
void fun(int*);
fun(a);
int j,i,n=0;
while(scanf("%d",&j)==1 && j){ //打表
for(n=0,i=2;i<=j/2;i++) {
if(a[i]!=0 && a[j-i]!=0){
n++;
}
}
printf("%d\n",n);
}
return 0;
}
void fun(int *a){ //a的非素数位为0,最后变成a[]={0,0,2,3,0,5,0,7,0,0,0,11,.....}
int i,j,k;
for(i=2;i<65536;i++){
for(j=2;j<=i/2;j++){ //判断 i 是不是素数。
if(i%j==0){
break;
}
}
if(j>i/2){
a[i]=i;
}
}
}