1. 问题描述:
小明最近痴迷于斐波那契数列(1,1,2,3,5……),但是最近他又有了新的奇思妙想,就是对于斐波那契数列的相邻的两个数相乘取倒数然后将每一项进行相加,由于小明只喜欢思考不喜欢动手,所以现在他想让你帮他算下这样一个新的数列的前13项的和为多少?(结果用分数表示,且保留最简分数)
输入描述:
无
输出描述:
无
备注:
例如前三项:1/(1*1)+1/(1*2)+1/(2*3)=5/3
2. 思路分析:
① 分析题目可以知道我们需要求解出前面十四项斐波那契数列,然后计算出相邻两项斐波那契数的乘积储存在列表中,接下来就是两个分数之间的计算了,因为需要求解的是最简的分数所以需要计算两个数字的最大公约数,可以使用下面的公式计算出两个分数相加的最简分数(首先需要计算出两个分数相加的结果的分子与分母,然后除以它们的最大公约数即可得到最简分数):
② 因为使用的是python语言所以可以使用python中的Fraction模块计算两个数字相除对应的分数,在循环中计算出斐波那契数然后使用Fraction计算出分数即可
3. 代码如下:
辗转相除法:
# 迭代求解最大公约数
def gcd(a: int, b: int):
while b != 0:
t = b
b = a % b
a = t
return a
def fenshu(a: int, b: int, c: int, d: int):
# 求解 a / b + c / d的最简分数
return (a * d + b * c) // gcd((a * d + b * c), b * d), b * d // gcd((a * d + b * c), b * d)
if __name__ == '__main__':
nums = [1, 1]
a, b, n = 1, 1, 0
# 计算前14项斐波那契数列
for i in range(3, 15):
c = a + b
a, b = b, c
nums.append(c)
# print(nums)
rec = list()
# 计算相邻两项斐波那契数列乘积
for i in range(13):
rec.append(nums[i] * nums[i + 1])
# print(rec)
# 两个分数相加
num1, num2 = 1, 1
for i in range(1, 13):
num1, num2 = fenshu(num1, num2, 1, rec[i])
print(str(num1) + "/" + str(num2))
使用python中的Fraction模块计算两个数字相除对应的分数:
from fractions import Fraction
if __name__ == '__main__':
a = 1
b = 1
res = 0
for i in range(13):
sum = Fraction(1, a * b)
a, b = b, a + b
res += sum
# print(a, b, res)
print(res)