斐波拉契数列+二进制--夏令营

1. f[40]={0,1}

数组赋值:只赋值前两个的话,剩余的自动为0

2.先要自己写出斐波拉契数列判断一下应该要多少个斐波拉契数样例,第39项已经超样例数500了,所以够用

3.就是把一个数字拆分成斐波拉契数列里的数的和嘛,但是要从数列中最大的数找,找到了就标注二进制数组中为1

4.输出时也是以高位开始,但是高位开始的就会有0不标记的,不作数,先排除,遇到第一个不为0的再把其后面的输出

#include 
using namespace std;

int main()
{
    int f[40]={0,1}, b[40], n, m;
    for (int i = 2; i < 40; i++)
    {
        f[i] = f[i - 1] + f[i - 2];
    }
    cin >> n;
    while (n--)
    {
        cin >> m;
        cout << m << " = ";
        for (int i = 39; i >= 0; --i)
        {
            if (f[i] <= m)
            {
                b[i] = 1;
                m -= f[i];
            }
            else b[i] = 0;
        }
        int j = 39;
        while (!b[j]) --j;
        while (j >=2) cout << b[j--];

        cout << " (fib)" << endl;
    }
    return 0;
}

你可能感兴趣的:(算法)