选数

目描述

已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34。

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29)。

输入输出格式

输入格式:

 

键盘输入,格式为:

n , k (1<=n<=20,k<n)

x1,x2,…,xn (1<=xi<=5000000)

 

输出格式:

 

屏幕输出,格式为:

一个整数(满足条件的种数)。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[1000];
int ans=0;
int b[1000];
int prime(int n){
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){
            return 0;
        }
    }
    return 1;
}/*判断是否是素数的函数*/
void zuhe(int n,int k){
    for(int i=n;i>=k;i--){
        b[k]=i;/*记录a[i]的下标*/
        if(k==1){
            int sum=0;
            for(int j=b[0];j>=1;j--) sum+=a[b[j]];
            if(prime(sum)) {
                ans++;
            }
        }
        else zuhe(i-1,k-1);/*k-1为计算下个数*/            
    }
    
}
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    b[0]=k;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    zuhe(n,k);
    cout<<ans;
}

核心代码,主要是理解中间的“zuhe(i-1,k-1);”这一句的含义。

以及,“b[k]=i;/*记录a[i]的下标*/”的用处,和对后面程序的影响;并且与写成“b[k]=a[i]”两种不同的代码作比较。

posted @ 2018-02-26 21:20  nono_ttaa  阅读(225)  评论(0编辑  收藏  举报