鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: zltzlt

[已解决]Python:每日一题 256

[复制链接]
发表于 2019-10-15 17:40:38 From FishC Mobile | 显示全部楼层
本帖最后由 __mrsq__ 于 2019-10-15 17:53 编辑
克里斯保罗 发表于 2019-10-15 13:12
看不太懂,可以解释一下吗


有点像最短路径法,把输入数值到小于输入数值的值和到达这个值的最小步数存在queue里面,然后把这个值标记为访问过了,因为后面再次访问这个值的步数都大于等于第一次访问这个值所用的步数,所以就没必要再次访问了。比如13 到 12是一步 13-1,13到9也是一步 13-4,13到4也是一步 13-9。然后第二次外层循环依次再对12 9 4做同样的操作把没访问过的remain存在queue里,内部循环在对9操作的时候的时候发现9-3*3为0,输出 step+1就是2程序结束
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-20 16:15:25 | 显示全部楼层
两种方法:递归与迭代,前者在递归允许范围内效率更高,后者没有层数限制
递归:
import math

def Pingfang(numb,max_gen,count=0):
    if numb >= max_gen**2:
        return Pingfang(numb-max_gen**2,max_gen,count+1)
    elif numb == 0:
        return count
    else:
        return Pingfang(numb,max_gen-1,count)

def Juece(numb):
    max_gen = int(math.sqrt(numb))
    numb_list = []
    while True:
        if max_gen**2 < numb/3:
            return min(numb_list)
        numb_list.append(Pingfang(numb,max_gen))
        max_gen -= 1

迭代:
import math

def Pingfang(numb,max_gen,count=0):
    while True:
        if numb >= max_gen**2:
            numb -= max_gen**2
            count += 1
        elif numb == 0:
            return count
        else:
            max_gen -= 1

def Juece(numb):
    max_gen = int(math.sqrt(numb))
    numb_list = []
    while True:
        if max_gen**2 < numb/3:
            return min(numb_list)
        numb_list.append(Pingfang(numb,max_gen))
        max_gen -= 1
测试请使用Juece函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-8 20:15:42 From FishC Mobile | 显示全部楼层
啦啦啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 10:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表