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;
}

 

posted @ 2022-03-05 14:36  梦想是能睡八小时的猪  阅读(61)  评论(0)    收藏  举报