验证哥德巴赫猜想

问题: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;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值