斐波那契数列之和的最后一位数字(m,n)

时间:2019-09-09 15:39:11

标签: c++ fibonacci

我对找到从索引m到索引n的斐波那契数列之和的最后一位数字感到怀疑(考虑起始项的索引为0)。

我有很多解决问题的方法。但是,对于ex m = 2,n = 82364572389等,也需要传递非常长的案例。但是当我尝试使用该算法时,我的一些测试用例通过了,但有些没有通过。

S,您可以帮我解决我的代码中是否存在任何问题或此算法是否错误。

还有如何使用更好的方法来解决此问题。

#include <iostream>
using namespace std;

long long calc_fib(long long n) {

    n = (n+2)%60;
    int fib[n+1];
    fib[0]=0;
    fib[1]=1;
    int res = 1;
    for(int i = 2; i<=n;i++){
        fib[i] = (fib[i-1]%10 + fib[i-2]%10)%10;
        // res = res + fib[i];
    }
    // cout<<fib[n]<<"\n";
    if(fib[n] == 0){
        return 9;
    }
    return (fib[n]%10-1);
}

int main() {

long long n = 0,m;

std::cin >> m;

    std::cin >> n;

    std::cout << calc_fib(n)-calc_fib(m-1) << '\n';
    return 0;
}

测试用例

Test Case: 5 10
Correct Output: 6
My Output: -4

Test Case: 1 10000000
Correct Output: 5
My Output: 5

2 个答案:

答案 0 :(得分:0)

您需要更改算法。

第一件事:不要递归计算值。就运行时间而言,这是非常昂贵的。从f(0)开始,然后从f(1)开始,然后使用最后两个存储的值计算f(2)。继续这样。仅存储最后两个值。

第二:意识到完全存储f(n)是没有意义的。您可以只保留 units tens (不需要十进制,但有助于调试)。看起来像: 1,1,2,3,5,8,13,21,34,55,89,44,33

请注意,89 + 44给出133,以33结尾,就像89 + 144给出233,也以33结尾。

一旦将两者结合起来,就需要一个循环,其中一个计数器为82364572389,并执行简单的加法/模运算。它应该在几分钟之内结束。

从那里开始,您可以开始考虑进一步的优化(有)。但是上面的两个应该足够了。

此外,通过评论,并重新阅读问题:

calc_fib(n) - calc_fib(m-1)

是错误的,因为它可能产生负数。而最后一位必须为正数。您可能需要采用这种差异 diff 并执行以下操作:

diff = (diff + 10) % 10;

使其正面。

最后,为什么是9?为什么在return (fib[n]%10-1);中为-1?这似乎使所有内容都偏移了一个,但是减法中的-1都抵消了。

答案 1 :(得分:0)

继续将和移到for循环内,如下所示:

#include <iostream>
using namespace std;

int main() {
    unsigned int i, j, n, v, sum;

    cout << "Fibonacci numbers from 1 to 10000: " << endl;

    cout << '1' << endl;
    cout << '1' << endl;
    cout << '2' << endl;
    for (i = j = v = 1, n = 2, sum = 4; n + j < 10000; sum += v) {
        v = n + j; i = j; j = n; n = v;
        cout << v << endl;
    }

    cout << "Sum of Fibonacci numbers from 1 to 10000: " << sum << endl;

    return 0;
}

添加到测试代码[http://codepad.org/8CHIepXe]的链接