hl
2018-01-02 16:07:23 +08:00
问题简化出来就是一个多元一次方程求可能解的问题,使用等差数列求和公式省掉不必要的循环
我提供一个我的思路:
1、生成 1~n 排列组合 list。 形式如[(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
2、if 条件判断 排列组合列表内 tuple 元素 a,b 的乘积与总和减 a,b 是否相等,相等则返回
3、使用内建 filter 函数获得结果
=====filter 函数=====
filter(function, sequence):
对 sequence 中的 item 依次执行 function(item),将执行结果为 True 的 item 组成一个 List/String/Tuple (取决于 sequence 的类型)返回
====用到两个东西==
1、python 内置的可重复排列组合函数 combinations_with_replacement()
2、1 至 n 总和 使用等差数列求和公式 Sn = n*a1 + n* (n – 1)*d/2 ( n 为项数,a1 为第一个数,d 为公差)
===公式补充说明===
等差数列求和公式:Sn = n*a1 + n* (n – 1)*d/2
n 为项数,d 为公差,在题主场景里由于是从 1 开始以 1 递增,且公差为 1,公式可以简化为:
Sn = n + n* (n – 1)/2
=======实现======
```python3
from itertools import combinations_with_replacement
def findPossible(n):
sn = range(1,n+1) #生成等差数列
combList = list(combinations_with_replacement(sn,2)) #生成排列组合列表
result = filter(lambda item: equationJudge(n, sn,item), combList) #对 combList 进行逐项 filter
return list(result)
def equationJudge(n, sn, t):
snLength = len(sn)
if t[0]*t[1] == snLength + snLength * ( n - 1 ) / 2 - t[0] - t[1]: #套用公式
return t
possibleNum = findPossible(26)
print (possibleNum)
```