sicily 1029. Rabbit | 高精度加法+递推(类斐波那契推导)

题目:1029. Rabbit
sicily 1029. Rabbit | 高精度加法+递推(类斐波那契推导)_第1张图片

题意:
• 开始有一对成年兔子
• 每对成年兔子每个月产生一对小兔子
• 每只小兔子经过m个月变成成年兔子
• 问经过d个月后有多少兔子
• 约束: 1 <= m <= 10, 1 <= d <= 100

解法:递推
• 这是一道计数问题,对于这类题目,一般是分
情况讨论。
• 比如说F[n]表示第n个月时兔子的数量
• 那么F[0] = 1
• 对于F[n](n>0),可以分成两部分:
• 第一部分上一个月已经有的兔子F[n-1]
• 第二部分新产生的兔子,那么新产生兔子需要经历d个月的兔子,那么就是F[n-d],所以我们可以得到递推式: F[n] = F[n – 1] + F[n – d]
• 另外注意的是对于Fn,我们为了切合实际情况,需要令F[n] = 1
• 注意到d=1时, F[n] = 2 * F[n – 1],这个时候F[100] = 2 ^ 100,这时我们需要高精度
• 对于递推式,我们只需要实现高精度加法就可以了
代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 102;
class bigInt{
public:
    int num[maxn];//储存数字的数组
    int len;//数字的长度
    bigInt(int initVal = 0)
    {
        memset(num, 0, sizeof(num));
        num[0] = initVal;
        len = 1;
    }
    void printNum()
    {
        for (int i = len - 1; i >= 0; i--)
        {
            cout << num[i];
        }
        cout << endl;
    }
};
bigInt operator+ (const bigInt& a, const bigInt& b)//模拟竖式加法
{
    bigInt res;
    int i, temp;
    int maxLen = max(a.len, b.len);
    for (i = temp = 0; i < maxLen || temp > 0; i++)
    {
        if (i < a.len) temp += a.num[i];
        if (i < b.len) temp += b.num[i];
        res.num[i] = temp % 10;
        temp /= 10;
    }
    res.len = i;//更新长度
    return res;
}

int main()
{
    int m, d;
    while (cin >> m >> d && m && d)
    {
        bigInt F[maxn];
        F[0].num[0] = 1;
        for (int i = 1; i <= d; i++)
        {
            F[i] = F[i - 1]; 
            if (i >= m)
            {
                F[i] = F[i] + F[i - m];
            }
            else
            {
                F[i] = F[i] + F[0];//F[i] = F[i] + 1 
            }
        }
        F[d].printNum();
    }
    //system("pause");
}

你可能感兴趣的:(Oj)