斐波那契数的平方和的最后一位

时间:2020-05-11 09:32:15

标签: c++ sum fibonacci

#include <iostream>
using namespace std;

int previous_fibonacci_last_digit(unsigned long long m) {
int previous = 0, current = 1;
for (unsigned long long i = 2; i <= m; i++) {
    int tmp_previous = previous;
    previous = current;
    current = ((tmp_previous % 10) + (current % 10)) % 10;

   return current;
}

int last_digit(unsigned long long n) {
     int lastDigit = ( previous_fibonacci_last_digit(n) * ( ( previous_fibonacci_last_digit(n) + previous_fibonacci_last_digit(n - 1) ) % 10 ) ) % 10 ; // found the last digit of the sum of squares of n fib numbers

     return lastDigit;
  }

要找到n个数字的平方和的最后一位,我发现总和可以写成F(n){F(n)+ F(n-1)},并且我在大数值时实现它。 当我使用long long int时,我的程序在n = 260548时崩溃,因此我将其更改为unsigned long long int,现在我的程序在n = 519265时崩溃了。

我尝试通过在previous_Fibonacci_last_digit()函数中添加一个cout来查看循环是否运行到500000,从而进行调试,但是我发现当n = 519265时,循环甚至没有运行到500000。我只是存储最后一个每个斐波那契数字的位数,所以我认为其中没有任何整数溢出。

编辑-现在,在使用变量存储最后一位数字之后,不再使用数组了,该程序可以正常运行,但是将其用于n = 1234567890,则需要花费很多时间。

3 个答案:

答案 0 :(得分:2)

    #include <bits/stdc++.h>

using namespace std;

int fib(long long num ){
    int pre=0,cur=1;
    num = num %60;
    if(num==0){
        return 0;}
    else if (num == 1){
        return 1;
    }
    else{
    for (int i =2; i<=num; i++){
        int temp = (pre+cur)%60;
        pre = cur;
        cur = temp;
        // cout<<pre<<"\n"<<cur<<"\n";
    }
    }
    
    return(cur); 
}

int main() {
    long long n = 0;
    cin >> n;
    int a = fib(n);
    int b = fib(n+1);
    
    cout<<(a*b)%10;
    
    
}

可以计算最多任何斐波那契数词的平方和,而无需明确地求平方。

如您所见

F1 ^ 2 + .. Fn ^ 2 = Fn * Fn + 1

现在要计算Fn和Fn + 1的最后一位,我们可以应用pissano周期法

可以通过%10计算最后一位,并且mod 10的pisano周期为60。因此,直接在代码中使用%60...。

答案 1 :(得分:0)

Python代码

def pisano_num_mod10(n):
   previous, current = 0, 1
   n=n%60 #num mod 10 gives 60 repeatations in Pisano Series.. Check Wikipedia by searching for Pisano Series to get more Info
   if (n == 0): 
       return 0
   elif (n == 1): 
       return 1
   else:
       for _ in range(2,n+1):
           previous, current= current, (previous + current)%60
       return current
if __name__ == '__main__':
    n = int(input())
    print(pisano_num_mod10(n)*pisano_num_mod10(n+1)%10)

输出:

if n=7 
pisano_num_mod10(n) returns 13
pisano_num_mod10(n+1) returns 21
It Prints 13*21%10=3

答案 2 :(得分:0)

我也想分享我的解决方案,它与上面的两个解决方案非常相似。另一方面,我将尝试提供尽可能多的解释,并以不同的方式做一个步骤,根据这种差异,我的代码通过了所有测试。

要考虑的第一个等式是: F_N * F_N+1

因此,我们只需要第 n 个和第 (n+1) 个 Fibonacci 值,而不是在每个步骤中计算斐波那契平方(这需要很长时间才能预测)。

但是,计算高于 Pisano 周期(即余数值重复自身的周期)的值也是不切实际的。由于我们只寻找最后一位数字,因此我们可以将问题视为所计算的斐波那契值平方和的模数 10。由于模 10 的 Pisano 周期是 60,我们可以在这里使用这个值。

这就是为什么对于任何给定的 n 输入数,如果我们取 n 的模 60 并计算平方和,我们将有效地减少计算时间。

最后,通过对计算值取模 10,我们可以返回最后一位数字。这是代码;

def last_digit_of_the_sum_of_squares_of_fibonacci_numbers(n):
   

    if n <= 1: #Check if the input value is too small
        return n

    n = n%60 #If not, take the mod60 of the input


    pre = 0 #First value of the Fibonacci series
    curr = 1 #Second value of the Fibonacci series
    for i in range(2, n+2): #Iterate until n+2, since we are looking for F_N + F_{N+1}
        pre, curr = curr, (pre+curr) #Calculate the current Fibonacci value

    return (pre*curr)%10 #return the mod10