一.题目要求
把 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)
三.总结
本文章主要就如何优化纯暴力问题做出了解决方案,如果对您有帮助的话,希望留个赞再走哦~~~