编程题-入门-哥德巴赫猜想-求最少素数

题目:
有108个村庄排在一条公路上,依次编号为0~108-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。
输入实例:3,[0,7,11]

输出:4

这里我使用的是python来进行求解。

求解思路:求牛牛村村庄之间距离的最少的素数个数。这里需要用到哥德巴赫猜想。
首先: 求出牛牛村庄之间的距离,如果距离为素数,那么在牛牛村庄之间就不需要建立车站;
距离为非素数(非素数):考虑两种情况;
如果为偶数,就可以表示成两个素数之和;
如果为奇数,表示成 距离(len) len=(en-2)+2
如果len-2为素数,那么len就可以表示成len-和2两个素数之和;
如果len-2为偶数,其中len-2可以表示成两个素数之和,len就可以表示成三个素数之和;

根据这个思路来进行代码编写:
python来进行编写:

p = input()
n = p.split(',',1)[0]
a = p.split(',',1)[1]
n = int(n)
a = eval(a)   #eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果
a.sort()
  #因为需要进行相应的计算,所以需要将输入利用切片进行拆分,拆分成所需要的形式,并进行转换,
import math
class Solution:
#这里的函数if_n就是为了判断这个数是不是素数。
    def if_n(self,num):
        if num == 0 or num == 1:
            return False
        if num == 2:
            return True
        for i in range(2,int(math.sqrt(num) + 1)):#判断一个比2大的数是不是素数。
            if num%i == 0:
                return False
        return True
    def work(self , n , a ):
        count = 0
        for i in range(n-1): #这里的n是牛牛村庄的个数。
            temp = a[i+1]-a[i] #temp用来计算相邻村庄的距离。
            if self.if_n(temp) or temp == 1:  #距离如果是素数或者为1就不用再之间建立车站。
                  
                continue
            else:    #如果不是素数,判断是否为偶数
                if temp%2 == 0:  是偶数,距离有两个素数之和,需要在之间建立一个车站。
                    count = count + 1
                    continue
                else:
                    if self.if_n(temp - 2): #不是偶数,需要将距离进行拆分成len-2和2,判断len-02是否为素数,如果为素数,距离是由len-2和2组成,就需要在之间建立一个车站。
                        count = count + 1
                        continue
                    else:
                        count = count + 2  #len-2部署素数,那么就是由三个数组成,就需要在之间建立两个车站。
                        continue
        return n+count #最后的总的车站是牛牛村庄的个数和之间建立的车站之和。
s= Solution() #先调用类,在调用类中的函数。
print(s.work(n,a))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椒椒。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值