📜  Zeckendorf定理的C ++程序(非邻近斐波那契表示法)(1)

📅  最后修改于: 2023-12-03 14:48:42.178000             🧑  作者: Mango

Zeckendorf定理的 C++ 程序(非邻近斐波那契表示法)

什么是 Zeckendorf 定理?

Zeckendorf 定理指出,每个自然数都可以唯一地表示为一系列斐波那契数的和,而且这些斐波那契数不能相邻。

例如,数字 20 可以表示为:13 + 5 + 2。

什么是非邻近斐波那契表示法?

非邻近斐波那契表示法是指,在 Zeckendorf 定理的基础上,可以允许相邻的斐波那契数之间隔着一个或多个斐波那契数。这样一来,每个自然数可以表示成多种可能的非邻近斐波那契表示法。

例如,数字 20 还可以表示为:13 + 3 + 2 + 1 + 1,其中,3、2、1、1 都是斐波那契数。

C++ 程序实现
#include <iostream>
#include <vector>

using namespace std;

vector<int> fib;

void generateFibonacci(int n) {
    fib.emplace_back(1);
    fib.emplace_back(2);
    int i = 2;
    while (fib[i - 1] + fib[i - 2] <= n) {
        fib.emplace_back(fib[i - 1] + fib[i - 2]);
        i++;
    }
}

vector<int> nonAdjacentFibonacciRepresentations(int n) {
    vector<int> ans;
    int i = fib.size() - 1;
    while (n > 0) {
        while (i > 0 && fib[i] > n) {
            i--;
        }
        ans.emplace_back(fib[i]);
        n -= fib[i];
        i -= 2;
    }
    return ans;
}

int main() {
    int n = 20;
    generateFibonacci(n);
    vector<int> ans = nonAdjacentFibonacciRepresentations(n);
    for (int a : ans) {
        cout << a << " ";
    }
    cout << endl;
    return 0;
}

以上是一个简单的 C++ 程序实现非邻近斐波那契表示法。程序分两个函数:generateFibonacci用于生成小于等于给定数的斐波那契数列,nonAdjacentFibonacciRepresentations用于找到给定数的所有非邻近斐波那契表示法。