我有义务编写程序,显示最小数量的Fibonacci数,其总和等于用户写入程序的k
数。
所以例如用户写1070
程序将显示987 89 -5 -1
(因为所有这些数字都是Fibonacci数字(您可以添加或减去以获得所需的总和)。
考虑解决这个问题我有问题。
我编写代码来获取0到46之间的所有Fibonacci数字。
#include <iostream>
unsigned long long Fibbo[47];
void preapare()
{
Fibbo[0] = 0;
Fibbo[1] = 1;
i = 2;
while (i<47)
{
Fibbo[i] = Fibbo[i - 1] + Fibbo[i - 2];
i++;
}
}
int main()
{
preapare();
int k=0;
std::cin >> k;
}
我会很高兴得到任何帮助。你可以多次使用Fibonacci数字。例如,你可以做1 + 1 + 1 + 1 + 1
答案 0 :(得分:1)
对于用户输入:
在while循环之前,您需要获取输入,将其保存到变量,并在while条件下使用它。像这样:
#include <iostream>
...
int k_val = 0;
std::cout << "Enter the value for k: ";
std::cin >> k_val;
...
答案 1 :(得分:1)
您的prepare()
已修复:
unsigned long long* preapare(const size_t n) {
unsigned long long* Fibbo = new unsigned long long[n];
Fibbo[0] = 0;
Fibbo[1] = 1;
for(size_t i = 2; i < n; ++i) {
Fibbo[i] = Fibbo[i - 1] + Fibbo[i - 2];
}
return Fibbo;
}
然后你将需要内存管理返回的数组;
答案 2 :(得分:1)
我已经完成了这个,代码将解决要添加的更大的斐波纳契数字,因此结果将是指定的数字:
fiboMax返回一个斐波纳契数小于输入数的序列。 getiboSec返回一个序列,其中包含较大的fibonacci数,它将输入数相加。
'''
Created on 15/01/2014
'''
def fiboMax(num):
ret = [0,1]
a = 1
b = 2
while b < num:
ret.append(b)
tmp = a + b
a = b
b = tmp
return ret
def getFiboSec(num):
fiboSec = []
fiboNumbers = fiboMax(num)
i = len(fiboNumbers) - 1
while num > 0 and i > 0:
fiboNum = fiboNumbers[i]
while(fiboNum <= num):
fiboSec.append(fiboNum)
num -= fiboNum
i -= 1
return fiboSec
if __name__ == '__main__':
num = 20
print(fiboMax(num))
print(getFiboSec(num))
输出:
figonnaci number to 20 = [0, 1, 2, 3, 5, 8, 13]
fibonacci number that sum 20 = [13, 5, 2]
它不能与负数一起使用,无论如何它解决问题但不是有效的方式。
答案 3 :(得分:1)
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
void prepare( vector<int> & fibos ) { ... } // along the lines we see in OPs code
int findClosest( int n, vector<int> & fibos ){ // return Fibonacci number closest to n
int fi = 0;
for( std::vector<int>::iterator it = fibos.begin() ; it != fibos.end(); ++it){
if( abs(*it - n) < abs(fi - n) ){
fi = *it;
}
}
return fi;
}
// The algorithm:
// lookup closest Fi, add "signed" to terms
// reduce n, adjust sign and call recursively
void sum( int n, vector<int> & fibos, vector<int> & terms, int sign = 1 ){
if( n == 0 ) return;
int fi = findClosest( n, fibos );
terms.push_back( sign*fi );
sum( abs(n - fi), fibos, terms, n - fi > 0 ? sign : -sign );
}
int main() {
vector<int> fibos;
prepare( fibos );
vector<int> terms;
int n = 1070;
sum( n, fibos, terms );
cout << n << " =";
for( std::vector<int>::iterator it = terms.begin() ; it != terms.end(); ++it){
cout << " " << *it;
}
cout << endl;
return 0;
}
答案 4 :(得分:0)
您正在循环中访问索引-2和-1。您的变量i
应该从2开始。您还尝试向指针添加值。 Fibbo[]
中没有设置任何值。