【问题标题】:Fibonacci mod number c++斐波那契模数 c++
【发布时间】:2016-08-09 01:56:00
【问题描述】:

我有以下问题: 我应该计算一个斐波那契数模另一个给定的数字。我知道 Pisano 时期,我正在尝试在这里实现它。这是代码:

#include <iostream>
#include <cstdlib>
long long get_fibonaccihuge(long long n, long long m) {
    long long period = 0;
    if (m % 2 == 0) {
        if(m / 2 > 1)
        period = 8 * (m / 2) + 4;
        else
        period = 3; 
    }
    else{
        if(((m + 1) / 2) > 1)
        period = 4 * ((m + 1) / 2);
        else
        period = 1;
    }

    long long final_period = n % period;



    long long array_fib[final_period];
    array_fib[0] = 1;
    array_fib[1] = 1;
    for (long long i = 2; i < final_period; ++i) {
        array_fib[i] = (array_fib[i-1] + array_fib[i-2]) % m;
    }

    return array_fib[final_period - 1];
}

int main() {
    long long n, m;
    std::cin >> n >> m;
    std::cout << get_fibonaccihuge(n, m) << '\n';
}

它适用于小型测试,但问题是它无法通过以下测试:

281621358815590 30524

我不知道为什么。关于算法的任何建议,我都提到了this 页面。当我在构建它时。

我收到的错误是:错误的结果。

预期:11963 我的结果:28651

【问题讨论】:

  • long long array_fib[final_period] 使用 g++ 语言扩展(即 C99 可变参数数组)。在标准 C++ 中使用 std::vector&lt;long long&gt; array_fib(final_period)。这不是你的逻辑问题,但我想我应该提一下:更好的发布标准代码,每个人都可以尝试。
  • 我知道错误应该是在我获取数字mod周期的那一刻,
  • 什么失败了?运行时错误?结果错误?你的输出是什么?
  • 你的结果是什么?预期的结果是什么?
  • 建议将其添加到您的问题中。

标签: c++ algorithm fibonacci mod


【解决方案1】:

除非您的任务是使用 Pisano 周期,否则我建议您使用更常见的已知方法以 log2(n) 步骤计算第 n 个斐波那契数(通过 2*2 矩阵的计算能力:https://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form) .

有两个原因:

  1. 这是一种更简单的算法,这意味着调试程序会更容易
  2. 对于您作为示例提到的数字,它应该更快(log2(n) 大约为 50,m/2 明显更多)。

【讨论】:

  • 这种方法是否将数字保持在 64 位整数大小内?
  • @Cheersandhth.-Alf:所有中间数字都将小于 m*m,因此 64 位数字就足够了。最大的数字将是 n 本身,但它也在 64 位范围内。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2015-06-05
  • 2014-05-23
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多