Java 大斐波那契数快速算法的最后一位

Java 大斐波那契数快速算法的最后一位,java,algorithm,fibonacci,biginteger,Java,Algorithm,Fibonacci,Biginteger,我试图用java来解决斐波那契问题,但是我的代码需要很长时间来处理大数字 问题描述 任务给定一个整数,斐波那契数的最后一位有一个循环。它每60个数字重复一次。因此,只需构建一个包含前60个数字的最后一个数字的表格,然后对输入进行模60运算并进行表格查找 您可以在任何在线(或离线)斐波那契数表中看到周期。底部有一个链接 为了建立表格,对于每个计算出的数字,如果它超过9,你可以减去10,因为你只需要最后一个数字,每个数字的最后一个数字只取决于前两个数字的最后一个数字。您可以使用intmath(既不需

我试图用java来解决斐波那契问题,但是我的代码需要很长时间来处理大数字

问题描述
任务给定一个整数,斐波那契数的最后一位有一个循环。它每60个数字重复一次。因此,只需构建一个包含前60个数字的最后一个数字的表格,然后对输入进行模60运算并进行表格查找

您可以在任何在线(或离线)斐波那契数表中看到周期。底部有一个链接

为了建立表格,对于每个计算出的数字,如果它超过9,你可以减去10,因为你只需要最后一个数字,每个数字的最后一个数字只取决于前两个数字的最后一个数字。您可以使用
int
math(既不需要
long
也不需要
biginger


链接:

您的实现确实很幼稚,因为要求您获取斐波那契数的最后一位数字,而不是实际的斐波那契数本身。你只需要跟踪最后一个数字,其他数字无关紧要

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    System.out.println(getFibonacciLastDigit(n));
}

private static int getFibonacciLastDigit(int n) {
    if (n <= 1) {
        return n;
    }
    int first = 0;
    int second = 1;
    int temp;

    for (int i = 1; i < n; i++) {
        temp = (first + second) % 10;
        first = second;
        second = temp;
    }
    return second;
}
publicstaticvoidmain(字符串[]args){
扫描仪=新的扫描仪(System.in);
int n=scanner.nextInt();
System.out.println(getfibonaccilastDigital(n));
}
私有静态int getFibonaccilastDigital(int n){
如果(npy中的代码必须为

lookup = {0:0,1:1}
N = int(input())
for i in range(2,N+1):
       lookup[i] = (lookup[i-1] + lookup[i-1])%10
print(lookup[N])

<>这里我用C++编写了一个程序,可以用java语言编写程序,通过这个代码,只需要找到第六十个斐波那契数,而且执行起来非常迅速,不需要再大数。
#include <iostream>

using namespace std;

long long int findOutTheFibonacciNumber(int n)
{
    int number = n % 60;
    if (number <= 1)
    {
        return number;
    }
    else
    {
        long long int a = 0;
        long long int b = 1;
        long long int c = 1;
        for (int i = 2; i <= number; i++)
        {
            c = (long long)a + b;
            a = b;
            b = c;
        }
        return c % 10;
    }
}

int main()
{
    int n;
    cin >> n;
    cout << findOutTheFibonacciNumber(n);
    return 0;
}
#包括
使用名称空间std;
long long int findOutTheFibonacciNumber(int n)
{
整数=n%60;
如果(数字n;

我不知道为什么如果我阻止他输入超过107个失败的测试用例,就会出现这种情况,所以我必须删除这个限制,因为它注定要失败,不是吗?这意味着不会有任何高于107的输入。而且,你不需要大的数字。@meowgoesthedog的提示非常好。我希望是“107”应该是10岁⁷. 我做了一个编辑来修正这个问题。这也不是最优的,因为除了另一个答案中的算法外,还有一个算法需要O(log(n))个步骤。如果这不是一个comp-sci练习(即使如此),那么这应该是唯一可以接受的答案。因为该算法几乎保证了恒定的计算复杂性。