Acwing:整数拆分(哥德巴赫猜想的运用)

题目描述:

分析: 

首先本题需要运用哥德巴赫猜想,虽然该猜想尚未被证明,但也没有举出反例,因此可以使用。

哥德巴赫猜想:

任一大于2的偶数都可写成两个质数之和

任何一个大于7的奇数都能被表示成三个奇质数的和

(x)表示整数 x 的除本身之外的最大因数,那么当x为质数时,f(x)=1,所以这一题其实就是让我们用最少的质数相加得到x,质数的个数就是这一题的答案。

那么当x为质数时,f(x)直接就等于1了,不用拆分。


当x为偶数时,任意一个大于2的偶数都可以拆分成两个质数之和。所以当x为偶数时,结果就是2。


当x为奇数时,我们要再分情况考虑,如果x-2是一个质数,那么我们把x拆分成x-2和2就可以得到最小的结果,结果是2;如果x-2不是质数,那结果必然大于2.因此利用结论:任何一个大于7的奇数都能被表示成三个奇质数的和,可以得出答案为3.

如何快速求质数,可以参考我的这篇文章:

快速判断素数的算法(比根号N的复杂度更快)_正在黑化的KS的博客-CSDN博客【代码】最快判断素数的算法(比根号N的复杂度更快)https://blog.csdn.net/m0_54689021/article/details/126842290?spm=1001.2014.3001.5501

AC代码 

from math import sqrt,floor

def prime(num) :
    if num == 2 or num == 3 : return True
    
    if num % 6 != 1 and num % 6 != 5 : return False
    
    for i in range(5,floor(sqrt(num))+1,6) :
        
        if num % i == 0 or num % (i+2) == 0 : return False
        
    return True
    
n = int(input())
    
# 分类讨论
if prime(n) : print(1) 
elif n % 2 == 0 : print(2)
elif prime(n-2) : print(2) 
else : print(3)
    
    
    
    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

UCSD.KS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值