东华oj-基础题第40题

我怕爱的太早我们不能终老 提交于 2020-01-25 19:59:26

40 分拆素数和

作者: xxx时间限制: 1S章节: 函数

问题描述 :

把一个偶数拆成两个不同素数的和,有几种拆法呢?

说明:

比如10,可以拆成3+7和5+5以及7+3,

但是3+7与7+3相同,只算一种,5+5由于两个素数相同,不计算在内。

因此,10的拆法只有一种。 输入说明 :

首先输入一个T(不超过500),然后输入T个正的偶数,其值不会超过10000。 输出说明 :

对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。 输入范例 : 4 4 6 8 10 输出范例 : 0 0 1 1

/*
	T40 分拆素数和 
	算法概述:对于一个偶数num,从2到num/2 - 1依次测试拆分是否满足要求 
*/

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

// 判断是否为素数 
int isPrim(int x) {
	int i = 0;
	
	for (i = 2; i <= sqrt(x); i++) {
		if (x % i == 0) {
			return 0;
		}
	}
	
	return 1;
}

// 构建素数表 
void primeArray(int primeFlag[], int n) {
	if (n < 2)
		return ;
	int i = 0, j = 0;
	int count = 0;
	
	for (i = 0; i < n; i++) {
		primeFlag[i] = 1;// 初始默认全为素数 
	}
	
	for (i = 2; i < n; i++) {
		if (primeFlag[i] == 1) {// 当前数为素数 
			for (j = 2; j * i < n; j++) {
				primeFlag[i * j] = 0;// 标记i * j不为素数 
			}
		}
	}
}

int main() {
	/*方法1*/
//	int T = 0;
//	int num = 0; 
//	int i = 0;
//	int count = 0;
//	
//	scanf("%d", &T); 
//	while (T) {
//		scanf("%d", &num);
//		
//		count = 0;
//		for (i = 2; i <= num / 2 - 1; i++) {
//			if (isPrim(i) == 1 && 
//			isPrim(num - i) == 1) {// 用于拆分的两数均为素数 
//				count++;
//			}
//		}
//		printf("%d\n", count);
//		 
//		T--;
//	}

	/*方法2(利用素数表)*/ 
	int primeFlag[10001];
	int T = 0;
	int num = 0; 
	int i = 0;
	int count = 0;
	
	primeArray(primeFlag, 10001);// 构建素数表 
	
	scanf("%d", &T); 
	while (T) {
		scanf("%d", &num);
		
		count = 0;
		for (i = 2; i <= num / 2 - 1; i++) {
			if (primeFlag[i] == 1 && 
			primeFlag[num - i] == 1) {// 用于拆分的两数均为素数 
				count++;
			}
		}
		printf("%d\n", count);
		 
		T--;
	}
	
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!