贝壳-算法笔试题

贝壳,笔试第一题 感觉挺有意思。。通过了 (其实是第二题不想写,第三题不会)

  1. 工资纳税金额 为 工资 的 最大因数(除自身外),工资可以拆为 任意份 (每份值必须 >1),每份单独纳税

input : 工资 x (1 < x < 10^9)

output :最少纳税值

解题关键是:质数 的 税是 1 ,所以 合数 拆为 质数之和;

又因 哥德巴赫猜想:任何大于5的奇数都是三个素数之和 (奇合数 纳税 最多为 3);

欧拉回信:每个大于2的偶数,都可表示为 两个质数之和 (故 偶数 纳税 为 2)

def isPrime(n):
    i = 2
    while i <= n ** 0.5:
        if n % i == 0:
            return False
        i += 1
    return True
def f(x):
    if isPrime(x):
        return 1
    if x % 2 == 0:
        return 2
    i = x - 1
    res = 0
    while i >= 2:
        if isPrime(i):
            res += 1
            x -= i
            i = x
            continue
        i -= 1
    return res

奇合数 纳税 最多为 3,为 2 时 一定是 拆为 2 和 x - 2,因为 奇 + 奇 = 偶,故需要有一个偶质数 即2
因此 函数 可简化为...

def f(x):
    if isPrime(x):
        return 1
    if x % 2 == 0 or isPrime(x-2):
        return 2
    return 3
#贝壳找房##笔试题目##题解#
全部评论
工资这道题我是转换为,一个数n最少可用几个质数表示。
点赞 回复
分享
发布于 2018-10-15 21:11
当时没想到…我是想着按3到num那样拆,但具体每次拆分后所有情况没想出怎么取该拆分所以情况
点赞 回复
分享
发布于 2018-10-15 21:18
滴滴
校招火热招聘中
官网直投
楼主66666
点赞 回复
分享
发布于 2018-10-15 21:20
哎~~~忘记了哥德巴赫猜想这回事了~~~
点赞 回复
分享
发布于 2018-10-15 21:22
楼主,你输入1355,输出是4,但是我用我的方法输出是3,求问怎么回事。。 def init(n):     prim=[True for i in range(n)]     prim[0]=False     for i in range(2,n):         if prim[i]:             k=2             while(k*i<n):                 prim[k*i]=False                 k+=1     return prim      #n=int(input()) n=1355 prim=init(n) trans=[0 for i in range(n+1)] for i in range(1,n+1):     trans[i]=1     k=2     while k<i and i%k!=0:         k+=1     if i%k==0:         trans[i]=i//k dp=[0 for i in range(n+1)] dp[2]=1 for i in range(3,n+1):     dp[i]=trans[i]     for k in range(2,i-1):         if dp[i-k]+trans[k]<dp[i]:             dp[i]=dp[i-k]+trans[k] print(dp[n]) 1355可分为3+31+1321,这是仨质数之和呀。。。
点赞 回复
分享
发布于 2018-10-15 22:31
第二题大家怎么做的 dfs超时
点赞 回复
分享
发布于 2018-10-15 22:40

相关推荐

头像
不愿透露姓名的神秘牛友
04-16 20:58
点赞 评论 收藏
转发
点赞 10 评论
分享
牛客网
牛客企业服务