关于斐波那契数的程序

Program about Fibonacci numbers

本文关键字:程序 于斐波      更新时间:2023-10-16

我有义务编写程序,该程序将显示最少数量的斐波那契数,其总和等于用户写入程序k数。

因此,例如用户写入1070程序将显示987 89 -5 -1(因为所有这些数字都是斐波那契数(您可以加减以获得所需的总和)。

我有问题要考虑解决这个问题的方法。

我编写了代码来获取从 0 到 46 的所有斐波那契数。

#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;
}

我会很高兴得到任何帮助。您可以多次使用斐波那契数。例如,你可以做 1+1+1+1+1<</p>

div class="answers">
#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;
}

对于用户输入:

在 while 循环之前,您需要获取输入,将其保存到变量中,并在 while 条件下使用它。像这样:

#include <iostream>
...
int k_val = 0;
std::cout << "Enter the value for k: ";
std::cin >> k_val;
...

您的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;    
}

然后,您必须对返回的数组进行内存管理;

我已经这样做了,代码将求解要添加的刨丝器斐波那契数,因此结果将是指定的数字:

fiboMax 返回一个斐波那契数小于输入数的序列。getiboSec 返回一个序列,其中包含与输入数字相加的较大斐波那契数。

'''
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]

它不适用于负数,无论如何它解决了问题,但不是有效的方法。

您正在访问循环中的索引 -2 和 -1。变量i应从 2 开始。您还可以尝试向指针添加值。未设置Fibbo[]中的任何值。