C++【选数】之递归

题源:洛谷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
        }
    }

}

程序中,indexbit的区别可见下图:
index和bit的区别

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值