Помогите решить задачу пожалуйста c++
Дано натуральное число, нужно его представить как произведение числе Фибоначчи больших 1. Вывести количество возможных вариантов разложения
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long n;
cin >> n;
for (long long i = 2; i * i <= n; ++i){
while (n % i == 0){
n /= i;
cout << i << " ";
}
}
if (n > 1)
cout << n;
}
Ответы (2 шт):
Автор решения: versetty777
→ Ссылка
Моё решение:
#include <iostream>
#include <vector>
std::vector<int> fibonacci_decomposition(int num) {
std::vector<int> fibonacci_numbers = {1, 1};
std::vector<int> result;
while (fibonacci_numbers.back() <= num) {
int next_fibonacci = fibonacci_numbers[fibonacci_numbers.size() - 1] + fibonacci_numbers[fibonacci_numbers.size() - 2];
fibonacci_numbers.push_back(next_fibonacci);
}
for (int i = fibonacci_numbers.size() - 2; i >= 1; i--) {
while (num >= fibonacci_numbers[i]) {
num -= fibonacci_numbers[i];
result.push_back(fibonacci_numbers[i]);
}
}
return result;
}
int main() {
int num = 15;
std::vector<int> fibonacci_decomposition_result = fibonacci_decomposition(num);
std::cout << "Number of possible decompositions: " << fibonacci_decomposition_result.size() << std::endl;
std::cout << "Decomposition: { ";
for (int i = 0; i < fibonacci_decomposition_result.size(); i++) {
std::cout << fibonacci_decomposition_result[i] << " ";
}
std::cout << "}" << std::endl;
return 0;
}
На выходе будет:
Number of possible decompositions: 3
Decomposition: { 8 5 2 }
Здесь нат. число 15 разлагается на сумму 8, 5 и 2, которые являются числами Фибоначчи > 1
Автор решения: Mikhailo
→ Ссылка
Негде проверить, но посмотрите, не годится это решение? Для чисел до порядка 1Е18.
#include <vector>
#include <iostream>
using namespace std;
vector<long long> F = {2, 3};
long long countF(long long n, long long min = 0) {
if (n == 1) return 1;
if (min == F.size()) return 0;
for (long long i = min; i < F.size(); ++i) {
if (n % F[i] == 0) {
return countF(n / F[i], i) + countF(n, i + 1);
}
}
return 0;
}
int main() {
for (long long a = 2, b = 3; a < 2000000000000000000ll;) {
long long c = a + b;
F.push_back(c);
a = b;
b = c;
}
long long N;
cin >> N;
cout << countF(N);
}
Для простых примеров, кажется, работает.