斐波那契数列(最大公约数)

21 篇文章 1 订阅
4 篇文章 0 订阅

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)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值