题目描述
有10^8 个村庄排在一条公路上,依次编号为 0 ~ 10^8-1 ,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。
示例1
输入3,[0,7,11]
输出
4
说明
在0,7,8,11处建造车站,差值分别为7,1,3,符合要求
思路
本题求得车站个数建立最少的是
情况1 如果十分巧合的情况下有 牛的村庄 之间的间隔就是1或者是质数 那么结果就是 有牛的村庄的个数
情况2 如果 有牛的村庄 之间的差值 不符合 条件2 的话,那么就需要在这中间插入一个或者多个普通的村中来满足需求
- 根据 哥德巴赫猜想 可以得到:任意一个大于2的整数都可以写成3个质数之和
- 如果相差的是偶数的话 就可以找到两个 奇质数之和 所以就需要加 1个 车站
- 如果相差的是奇数的话 最多需要加 2个车站 ,但是也有特殊情况 例如 19=2+17,15=2+13,21=2+19,这种情况就需要加1个就好了 这种情况都是 偶素数(质数也叫素数)+奇素数 ,所以就需要判断 这个
奇数-2
的结果是否是质数,如果是 就只加1个,如果不是就得需要加2个
代码
import java.util.*;
public class Solution {
/**
*
* @param n int整型
* @param a int整型一维数组
* @return int整型
*/
public int work (int n, int[] a) {
int count = n;
for(int i = 1 ; i < n ; i++){
int result = a[i]-a[i-1];
if( result != 1 && !isPrime(result)){
if( result % 2 == 0 || isPrime(result - 2) ){
count += 1;
}else{
count += 2;
}
}
}
return count;
}
/**
* 判断src是否是质数
* @param src int 想要验证的数值
*/
public static boolean isPrime(int src){
double sqrt = Math.sqrt(src);
if (src < 2) {
return false;
}
if (src == 2 || src == 3) {
return true;
}
if (src % 2 == 0) {// 先判断是否为偶数,若偶数就直接结束程序
return false;
}
for (int i = 3; i <= sqrt; i+=2) {
if (src % i == 0) {
return false;
}
}
return true;
}
}