1. 程式人生 > 其它 >拆素數【找規律,數學】

拆素數【找規律,數學】

技術標籤:筆試題

牛牛現在有一個包含 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)%2

1,從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; }