C++ 斐波那契数平方和的最后一位 #包括 使用名称空间std; int上一个fibonacci最后一个数字(无符号长m){ int-previous=0,current=1; 对于(无符号长i=2;i#包括 使用名称空间std; int fib(long-long-num){ int pre=0,cur=1; num=num%60; 如果(num==0){ 返回0;} else if(num==1){ 返回1; } 否则{ 对于Python中的(int i=2;i
代码C++ 斐波那契数平方和的最后一位 #包括 使用名称空间std; int上一个fibonacci最后一个数字(无符号长m){ int-previous=0,current=1; 对于(无符号长i=2;i#包括 使用名称空间std; int fib(long-long-num){ int pre=0,cur=1; num=num%60; 如果(num==0){ 返回0;} else if(num==1){ 返回1; } 否则{ 对于Python中的(int i=2;i,c++,sum,fibonacci,C++,Sum,Fibonacci,代码 #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
#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;
}
输出:
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)
我也想分享我的解决方案,这与上面的两个解决方案非常相似。另一方面,我将尽可能多地提供解释,我会以不同的方式执行一个步骤,根据这一差异,我的代码通过了所有测试 第一个要考虑的方程是: 因此,我们只需要第n个和(n+1)个Fibonacci值,而不是在每一步计算一个Fibonacci平方(这需要很长的时间才能预测) 但是,计算高于Pisano周期的值是不现实的(这只是剩余值自身重复的周期)因为我们只寻找最后一个数字,所以我们可以把这个问题看作是Fibonacci值的平方和的模10,因为模10的皮萨诺周期是60,所以我们可以在这里使用这个值。 这就是为什么,对于任何给定的输入数n,如果我们取n的模60并计算平方和,我们将有效地减少计算时间 最后,通过取计算值的模10,我们可以返回最后一位数字
if n=7
pisano_num_mod10(n) returns 13
pisano_num_mod10(n+1) returns 21
It Prints 13*21%10=3
def fibonacci数(n)的平方和的最后一位数字:
如果n或通过大数组int fib1[m]
为什么需要数组、大数或递归?只需一直使用最后一个数字。这些练习的要点是让你意识到不需要保留整个数字。在计算的每个阶段,你只需要最后一个数字。记住,(a+b)mod 10=(a mod 10)+(b mod 10)和a*b(mod 10)=(a mod 10)*(b mod 10)。所以在每次加法和乘法之后,都要做v%=10;
。尝试使用std::vector
int fib[m]
是一个非标准扩展,如果内存可用,将在内存非常有限的堆栈中分配。有两个观察结果可以帮助您。首先,要计算f_i,您只需要f_{i-1}和f_{i-2}。其次(a+b)mod x=((a mod x)+(b mod x))mod x.如果你同时使用这些函数,你只会受到你自己耐心的限制。你也不需要任何数组。你所需要的只是序列中的最后两个值。因此,如果你正确地编码了数组,所有关于如何分配数组的注释都不应该适用。它应该需要恒定的内存。我已经实现了你的sol但有趣的是,它为第239个斐波那契数计算了一个错误的值。
if n=7
pisano_num_mod10(n) returns 13
pisano_num_mod10(n+1) returns 21
It Prints 13*21%10=3
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