Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 斐波那契数和的最后一位_Python_Python 3.x_Fibonacci_Largenumber - Fatal编程技术网

Python 斐波那契数和的最后一位

Python 斐波那契数和的最后一位,python,python-3.x,fibonacci,largenumber,Python,Python 3.x,Fibonacci,Largenumber,我试图找到斐波那契级数和的最后一位。我将总和计算为F(n+2)-1。下面的代码工作正常,但对于较大的数字(例如99999)速度较慢。 我如何优化它 n = int(input()) def last_digit(n): a, b = 0, 1 for i in range(n+2): a, b = b, a + b return (a-1) % 10 print(last_digit(n)) 下面是专门为最后一位数字优化的代码: def fib(n)

我试图找到斐波那契级数和的最后一位。我将总和计算为
F(n+2)-1
。下面的代码工作正常,但对于较大的数字(例如
99999
)速度较慢。 我如何优化它

n = int(input())

def last_digit(n):
    a, b = 0, 1
    for i in range(n+2):
        a, b = b, a + b
    return (a-1) % 10

print(last_digit(n))

下面是专门为最后一位数字优化的代码:

def fib(n):
    a, b = 0, 1
    r = 1
    if n < 1:
        return 0
    for i in range(n - 1):
        a, b = b, (a + b)%10
        r += b
        r %= 10
    return r
def fib(n):
a、 b=0,1
r=1
如果n<1:
返回0
对于范围(n-1)内的i:
a、 b=b,(a+b)%10
r+=b
r%=10
返回r
它的工作原理是只获取下一学期的最后一位数字,并将其添加到结果中。然后,它获取结果的最后一位数字并将其设置为自身。它会重复,直到到达术语编号并返回一个一位数:D

有趣的事实:
在99上尝试上述功能。返回0。999怎么样?09999? 0继续:D

斐波那契数的最后一个数字系列,循环为60。因此,您可以将n项之和的计算优化为
F((n+2)%60)-1
。此外,要保持在整数范围内,您只能保留每个术语的最后一位:

def last_digit(n):
    a, b = 0, 1
    for i in range((n + 2) % 60):
        a, b = b, (a + b) % 10
    return 9 if a == 0 else a - 1

print([last_digit(n) for n in range(1, 11)])
输出:

[1, 2, 4, 7, 2, 0, 3, 4, 8, 3]
请看这张表: 请注意,
fib(60)
最后一个数字是
0
fib(61)
最后一个数字是
1
,这与
fib(0)
fib(1)
相同,因此从
60开始,最后一个数字开始重复,因此您可以计算
fib(n%60)
的最后一个数字,而不是
fib(n)
。 例如,
fib(115)
fib(55)
的最后一位数字相同,等于
5

尝试使用。如果要计算最后一位数字,Pisano周期10将是60。了解这一点后,您可以使用类似以下功能:

def fibonacci_sum(n):

    pisano = 60

    if n < 2: return n

    n %= pisano

    fib_arr = [1,1]
    for _ in range(n):
        fib_arr.append((fib_arr[-1] + fib_arr[-2]) % 10)

    return (fib_arr[-1] - 1) % 10
def fibonacci_和(n):
皮萨诺=60
如果n<2:返回n
n%=皮萨诺
fib_arr=[1,1]
对于范围内的u(n):
fib_arr.append((fib_arr[-1]+fib_arr[-2])%10)
返回(fib_arr[-1]-1)%10
有关更多信息,请参阅


干杯

> P>这是一个简单的C++程序< /P>
//outputs last digit of ( sum of fib number till n)
#include<iostream>
using namespace std;

int64_t fib_sum_digit(int64_t n)
{
    int fl[60] ={0};
    fl[0] = 0;
    fl[1] = 1;
   // int64_t sum60 = 1;

    for(int i = 2 ; i<60 ; i++)
    {
        fl[i] = (fl[i-1] +fl[i-2])%10 ; 
        //sum60 += fl[i]; 
    }


    int64_t sum = 0;
    // sum += (sum60*(n/60));               ///sum60%10 always  = 0 ;

    for(int i = 1; i<=(n%60); i++ )
    {
        sum += (fl[i]);
        //cout<<i<<","<<sum<<"->";         ///debug
    }

return sum%10;
}

int main()
{
    int64_t n;
    cin>>n;

    int64_t ans = fib_sum_digit(n);
    cout<<ans;

    return 0;
}
//输出的最后一位数字(fib数的和,直到n)
#包括
使用名称空间std;
int64纤维和数字(int64)
{
int fl[60]={0};
fl[0]=0;
fl[1]=1;
//int64_t sum60=1;

对于(int i=2;iThe),斐波那契序列增长非常快(呈指数增长),这导致Python采用任意精度类型。您将需要模数学规则将数字保持在32/64位整数范围内。有一种方法…检查我下面的答案。