目描述
已知 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]”两种不同的代码作比较。