将给定整数表示为Fibonacci之和

输入的 N <= 10000,而 F[21] = 10946, 所以只需求出 Fibonacci 前 20 项足以
样例输入输入


#include 

int FBNQ[21] = {0};

void get_FBNQ()
{
    FBNQ[1] = 1;
    FBNQ[2] = 1;
    for(int i = 3; i < 21; i++)
    {
        FBNQ[i] = FBNQ[i - 1] + FBNQ[i - 2];
    }
}
bool is_FBNQ(int n)
{
    for(int i = 1; i < 21; i++)
    {
        if(n == FBNQ[i])
        {
            return true;
        }
    }
    return false;
}

int main()
{
    get_FBNQ();
    int n;
    while(scanf("%d", &n), n != 0)
    {
        if(is_FBNQ(n))//特判
        {
            printf("%d\n", n);
            continue;
        }
        while(!is_FBNQ(n))//当n不是斐波那契数
        {
            for(int i = 20; i >= 0; i--)//找到小于n的最大斐波那契数
            {
                if(FBNQ[i] <= n)
                {
                    printf("%d+", FBNQ[i]);
                    n = n - FBNQ[i];
                    break;
                }
            }
        }//此时 n 必然是 Fibonacci 数
        printf("%d\n", n);
    }
    return 0;
}

你可能感兴趣的:(将给定整数表示为Fibonacci之和)