拆素数【找规律,数学】

牛牛现在有一个包含 n 个正整数的数组 a ,牛牛可以将其中的每个数 a[i] 都拆成若干个和为 a[i] 的正整数,牛牛想知道拆后(也可以一个数都不拆)这个数组最多能有多少个素数。

对于1,它本来就不是素数,最多能拆成0个素数的和;

对于2和3,最多能拆成1个素数的和;

4 = 2 + 2,最多能拆成2个素数的和;

5 = 2 + 3,最多能拆成2个素数的和;

6 = 2 + 2 + 2,最多能拆成3个素数的和;

7 = 2 + 2 + 3,最多能拆成3个素数的和;

8 = 2 + 2 + 2 + 2,最多能拆成4个素数的和;

……

由此易知,从4开始,所有的数都可以拆成若干2和3的和,并且可以通是否有3来控制奇偶性。num%20时,有多少个2就有多少个素数,此时(num+1)%21,从num的求和式中随便挑一个2替换成3就能够凑出num+1,求和式中素数的个数不变,num+2只是又拆出一个2重复这个过程,此时num+2的求和式中相比num+1和num,素数增加一个。综上,每个数num最多可以拆成(int)num/2个素数相加。

如此一来,我们就可以通过遍历数组得到答案:


#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    cin >> n;
    long long int cnt = 0;
    while(n) {
        cin >> m;
        if(m == 2 || m == 3) {
            ++cnt;
        }
        else {
            cnt += m / 2;
        }
        n--;
    }
    cout << cnt << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值