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;
}
来源:CSDN
作者:一枚IT小白
链接:https://blog.csdn.net/qq_41409120/article/details/104072070