【题解】斐波那契数列最大公约数

【问题描述】

斐波那契数列满足 F1 = F2 = 1,从 F3 开始有 Fn = Fn-1 + Fn-2。请你计算
GCD(F2020, F520),其中 GCD(A, B) 表示 A 和 B 的最大公约数。

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解题思路

  • 求出两个斐波那契数

  • 用求得的数做最大公约数计算。

  1. 可以利用递归求出斐波那契和最大公约数,由于花费时间过长,不使用。

  2. 使用BigInteger存取,用long则会溢出。求最大公约数可以使用欧几里得算法,BigInteger里已经封装此方法(gcd)。

  3. 记得学习BigInteger其他方法。

【扩展】

用递归求斐波那契

/**
 * @param n : Fib的第几项
 */
static int Fibonacci(int n) {
    if (n == 2 || n == 1) {
        return 1;//递归出口
    }
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

用递归求最大公约数

// 利用辗转相除法和递归计算最大公约数
static int GCD(int n, int m) {

    if (n % m == 0) {
        return m;//递归出口
    }

    return GCD(m, n % m);//辗转相除法
}

【代码】

import java.math.BigInteger;

/**
 * 题目: 斐波那契最大公约数
 */
public class topic05 {
    public static void main(String[] args) {
        BigInteger Fib2020 = Fibonacii(2020);
        BigInteger Fib520 = Fibonacii(520);

        // 使用BigInteger提供的gcd方法求得最大公约数
        System.out.println(Fib2020.gcd(Fib520));
    }

    /**
     * @param n : Fib的第几项
     */
    static BigInteger Fibonacii(int n) {
        BigInteger first = BigInteger.ONE; // 基本常量1
        BigInteger second = BigInteger.ONE;
        BigInteger temp = null; // 记录前两项的和

        if (n <= 2) return first;// 前两项都是1

        for (int i = 3; i <= n; i++) {
            // 新的项是前两项相加
            temp = first.add(second);
            // 后移
            first = second;
            second = temp;
        }
        return temp;
    }

结果

6765

posted @   Gonfei  阅读(474)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示