蓝桥杯实战---数的分解问题(时间范围内解法)

一.题目要求

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2和 4,一共有多少种不同的分解方法?

注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18和 18+1000+1001 被视为同一种。

二.解题思路

(1) 我们可能会有一个错误的思路:选择遍历三遍2019,然后找出符合要求的项,但是这种方法过于暴力,错误示例如下图代码所示:

num = 0
import time
for i in range(2019):
    start = time.time()
    for j in range(2019):
        for m in range(2019):
            if ['2','4'] not in list(str(i)) and ['2','4'] not in list(str(j)) and['2','4'] not in list(str(m)):
                if i + m +j == 2019:
                    num += 1
    end = time.time()
    print(str(end-start) + 's')
print(num)

这样的话得到的结果是,实现一轮循环就要9~10s的时间,整个程序运行下来大概需要1个小时的时间,可能对于我们来说时间太长了。

(2)考虑第二种思路,对三个数字进行大小化排列处理,由于数据量不是特别大则可以考虑使用三重遍历的方法,当然可以选择剪枝的操作尽量缩小遍历长度

并且为了满足题目中顺序的需求,我们可以采用顺序遍历的方式,这样就没有顺序方面的后顾之忧。

由于三个数当中,最小的数一定小于或等于2019//3 = 672 ,但是672中含2,所以可以取到671即可。

然后考虑第二大的数的范围,其最大为 (2019-1) / 2 - 1 = 1008 第一个减1是让最小数为1,第二个减1是为了使第二大的数小于最大的数


# 由于数据量不是特别大则可以考虑使用三重遍历的方法
# 当然可以选择剪枝的操作尽量缩小遍历长度

num = 0
for i in range(1,672):
  for j in range(i+1,1009):
    k = 2019 - i - j
    if (k > j and '2' not in str(i)+str(j)+str(k) and '4' not in str(i)+str(j)+str(k)):
      num += 1
print(num) 

三.总结

本文章主要就如何优化纯暴力问题做出了解决方案,如果对您有帮助的话,希望留个赞再走哦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值