题目描述

有10^8个村庄排在一条公路上,依次编号为010^8-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。

题解:

纪念我第一次做这种题,以前都是做竞赛题
题目看似杂乱无序,但其实冥冥中都遵循着规律
没错就是哥德巴赫猜想
哥德巴赫猜想:
任一大于2的偶数都可写成两个素数之和
所以我们可以将题目总结为:
1.当两站之间距离为素数,那两站之间就不用修站了,就光算上第二个站所修的,num++
2.如果两站之间距离不为素数,但是为偶数,然后偶数可以写成两个素数之和,也就是在两个站中间存在一个位置,将距离分为两个素数距离,所以num+2
3.如果不是素数,也不是偶数。又因为奇数=奇数+偶数,并且2是唯一的偶数的素数,所以如果距离-2是素数的话,就说明中间可以放一个站将距离分为2和另一个素数,如果不能就要放两个站才可以,分别是num+2,num+3
4.每个站本身也要算上
ok,撒花✿✿ヽ(°▽°)ノ✿

代码:

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param a int整型一维数组 
     * @param aLen int a数组长度
     * @return int整型
     */
    bool iff(int n)
    {
        if(n==1)return 1;
        if(n==2)return 1;
        for(int i=2;i<=sqrt(n);i++)
        {
            if(n%i==0)return 0;
        }
        return 1;
    }
    int work(int n, int* a, int aLen) {
        // write code here
        int num=0;
        for(int i=1;i<aLen;i++)
        {
            int len=a[i]-a[i-1];
            if(iff(len))num++;
            else if(len%2==0)num+=2;
            else if(len%2==1)
            {
                if(iff(len-2))num+=2;
                else num+=3;
            }
        }
        num+=1;
        int sum=num;
        return sum;
    }
};