关于斐波纳契数的程序

时间:2014-01-15 11:18:08

标签: c++ algorithm

我有义务编写程序,显示最小数量的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

5 个答案:

答案 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[]中没有设置任何值。