📅  最后修改于: 2023-12-03 14:48:42.178000             🧑  作者: Mango
Zeckendorf 定理指出,每个自然数都可以唯一地表示为一系列斐波那契数的和,而且这些斐波那契数不能相邻。
例如,数字 20 可以表示为:13 + 5 + 2。
非邻近斐波那契表示法是指,在 Zeckendorf 定理的基础上,可以允许相邻的斐波那契数之间隔着一个或多个斐波那契数。这样一来,每个自然数可以表示成多种可能的非邻近斐波那契表示法。
例如,数字 20 还可以表示为:13 + 3 + 2 + 1 + 1,其中,3、2、1、1 都是斐波那契数。
#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
用于找到给定数的所有非邻近斐波那契表示法。