题源:洛谷P1036【选数】
个人认为本题运用递归比较好。
先了解一下本程序的脉络图(程序结构图):
对于质数的判断有很多种方法,这里不展开,本题的关键就是在n个数中任意选取k个数(k<n)
方法:

接下来对change函数进行分析:
void change(int a[], int cb[], int bit, int index, int &k, int &n) {
/*
*变量说明:
数组a[]:给出的所有数
数组cb[]:cb表示“组合”,其中包含k个数,从数组a[]内选取3个数(下标从小到大排序)
bit:位,k个数的k个位置,也是数组cb[]的下标【数组内是k个数的组合】
index:指标,由于数组cb[]内的数对应于a[]的下标是从小到大排列的,index是cb[]中第x个数的范围为index~n-1
◎建议先看下方的图
k、n:即k、n
*/
int sum; //k个数之和
for(int i=index;i<n;i++) {
cb[bit]=a[i]; //cb[bit]可以是index(=bit)到n-1的所有数
if(bit<k-1)
change(a,cb,bit+1,i+1,k,n); //继续执行下一bit,但是下一执行的index要大于i
if(bit==k-1) { //当组合齐全k个数时,进行计算
sum=0;
for(int j=0;j<k;j++)
sum+=cb[j]; //k个数之和
if(isprime(sum)) //判断质数
count++; //结果加1
}
}
}
程序中,index和bit的区别可见下图:

这样,加上质数判断,main函数内解决输入问题,调用change,输出结果,就组成了完整的程序。

1303

被折叠的 条评论
为什么被折叠?



