#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,则需要花费很多时间。
答案 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)
我也想分享我的解决方案,它与上面的两个解决方案非常相似。另一方面,我将尝试提供尽可能多的解释,并以不同的方式做一个步骤,根据这种差异,我的代码通过了所有测试。
要考虑的第一个等式是:
因此,我们只需要第 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