C程序:验证“哥德巴赫猜想”

哥德巴赫猜想:任何一个大于2的偶数总能表示为两个素数之和。设计一个C语言程序,在int范围内验证此猜想。(要求:不得自定义函数。)

输入格式:

输入一个大于2的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。

#include<stdio.h>
#include<math.h>

int main(){
	
	int n, i, j, flaga, flagb;
	
	scanf("%d", &n);
	
	for(i=2; i<=n/2; i++){	 // 注:i<=n/2 	
		// 思路:从i=2开始,寻找这样的 i :  i是素数 并且 n-i 也是素数 		
		//  (1) 判断 i 是否是素数 
		flaga=1;
		for (j=2; j<=sqrt(i); j++){
			if(i%j==0){
				flaga=0;
				break;
			}
		}
		
		// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数 
		if(flaga==1){
			
			flagb=1; 
			for (j=2; j<=sqrt(n-i); j++){
				if((n-i)%j==0){
					flagb=0;
					break;
				}
			}
			
			// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一) 
			if (flagb==1){ 
				printf("%d = %d + %d\n", n, i, n-i);
			}			
		}
	}
	
	return 0;
}

输入:

200

输出:

200 = 3 + 197
200 = 7 + 193
200 = 19 + 181
200 = 37 + 163
200 = 43 + 157
200 = 61 + 139
200 = 73 + 127
200 = 97 + 103

由此得出结论:这样的分解一般不唯一。

【扩展1】因为这样的分解不唯一,若只要求输出所有“N = p + q”分解中p最小的分解,则程序如下(增加了下面程序中的最后一个break):

#include<stdio.h>
#include<math.h>

int main(){
	
	int n, i, j, flaga, flagb;
	
	scanf("%d", &n);
	
	for(i=2; i<=n/2; i++){	 // 注:i<=n/2 	
		// 思路:从i=2开始,寻找这样的 i :  i是素数 并且 n-i 也是素数 		
		//  (1) 判断 i 是否是素数 
		flaga=1;
		for (j=2; j<=sqrt(i); j++){
			if(i%j==0){
				flaga=0;
				break;
			}
		}
		
		// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数 
		if(flaga==1){
			
			flagb=1; 
			for (j=2; j<=sqrt(n-i); j++){
				if((n-i)%j==0){
					flagb=0;
					break;
				}
			}
			
			// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一) 
			if (flagb==1){ 
				printf("%d = %d + %d\n", n, i, n-i);
				
				break;    
			}			
		}
	}
	
	return 0;
}

输入:

100

输出:

100 = 3 + 97

【扩展2】因为这样的分解不唯一,若只要求输出所有“N = p + q”分解中p最大的分解,则程序如下:

#include<stdio.h>
#include<math.h>

int main(){
	
	int n, i, j, flaga, flagb;
	
	scanf("%d", &n);
	
	for(i=n-2; i>=n/2; i--){	 // 注:i<=n/2 	
		// 思路:从i=2开始,寻找这样的 i :  i是素数 并且 n-i 也是素数 		
		//  (1) 判断 i 是否是素数 
		flaga=1;
		for (j=2; j<=sqrt(i); j++){
			if(i%j==0){
				flaga=0;
				break;
			}
		}
		
		// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数 
		if(flaga==1){
			
			flagb=1; 
			for (j=2; j<=sqrt(n-i); j++){
				if((n-i)%j==0){
					flagb=0;
					break;
				}
			}
			
			// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一) 
			if (flagb==1){ 
				printf("%d = %d + %d\n", n, i, n-i);
				
				break;
			}			
		}
	}
	
	return 0;
}

或者如下:

#include<stdio.h>
#include<math.h>

int main(){
	
	int n, i, j, flaga, flagb;
	
	scanf("%d", &n);
	
	for(i=2; i<=n/2; i++){	 // 注:i<=n/2 	
		// 思路:从i=2开始,寻找这样的 i :  i是素数 并且 n-i 也是素数 		
		//  (1) 判断 i 是否是素数 
		flaga=1;
		for (j=2; j<=sqrt(i); j++){
			if(i%j==0){
				flaga=0;
				break;
			}
		}
		
		// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数 
		if(flaga==1){
			
			flagb=1; 
			for (j=2; j<=sqrt(n-i); j++){
				if((n-i)%j==0){
					flagb=0;
					break;
				}
			}
			
			// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一) 
			if (flagb==1){ 
				printf("%d = %d + %d\n", n, n-i, i);
				
				break;    
			}			
		}
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值