62 分拆素数和
问题描述 :
把一个偶数拆成两个不同素数的和,有几种拆法呢?
说明:
比如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
思想:首先计算10000内的所有素数,存入一个数组中,然后遍历输入的数,使用两层遍历,外层从第0个素数开始,终止条件是这个素数小于当前遍历数字的一半(防止重复计算),内层从第0个素数开始,结束条件是这个素数小于当前遍历数字,每当遍历到内层数字+外层数字=目标数字的时候就将计数器++。
#include <stdio.h> #include <stdlib.h> int isVegetableNum(int x){ for(int i = 2;i<x;i++){ if(x%i==0){ return 0; } } return 1; } int main() { int num, i, j, k,s=0; int length =0; int vegetableNum[10000]={0}; for(i=2;i<10000;i++){ if(isVegetableNum(i)){ vegetableNum[length++] = i; } } scanf("%d",&num); int nums[num]; int res[500]={0}; for(i=0;i<num;i++){ scanf("%d",&nums[i]); } for(i = 0;i<num;i++){ for(j=0;vegetableNum[j]<nums[i]/2;j++){ for(k=0;vegetableNum[k]<nums[i];k++){ if(vegetableNum[j]+vegetableNum[k]==nums[i]){ res[s]++; } } } s++; } for(i =0;i<s;i++){ printf("%d\n",res[i]); } return 0; }