Sicily 1029. Rabbit

31 篇文章 0 订阅
/*
【题目大意】
一对兔子每个月可以产两只小兔子,小兔子过了m个月可以长大,兔子不会死,求d个月之后兔子的总数 
【解题思路】 
不可生育的兔子用数组存储,高精度加法
*/
/*
Run Time: 0.06secs
Run Memory: 312KB
*/
#include <iostream>
#include <string>

using namespace std;

int m;  //兔子长大需要的时间 1-10
int d;  //d个月之后 1-100


string actCount;        //初始化可生育兔子数 
string unAct[11];       //不可生育兔子数(0到m-1) 

//高精度加法 
inline string Add(string a, string b){
    //调节为a长b短 
    if(a.length() < b.length()){
        string buf = a;
        a = b;
        b = buf;
    } 
    //补零 
    a += '0';
    while(a.length()-b.length() != 0)
        b += '0';
        
    int add = 0;
    string result = ""; 
    for(int i=0; i<b.length(); i++){
        int buf = add + (a[i]-'0') + (b[i]-'0');
        if(buf/10 == 1)
            add = 1;
        else 
            add = 0;
        result += (buf%10) + '0'; 
    } 
    
    if(result[result.length()-1] == '0')
        return result.substr(0, result.length()-1);
    else
        return result;   
}



int main()
{
    while (cin>>m>>d && (m || d)){
        actCount = "1";
        
        for(int i=0; i<m; i++)
            unAct[i] = "0";
        
        for(int i=1; i<=d; i++){
            actCount = Add(actCount, unAct[0]);   //一部分兔子已经可以生育 
            for(int j=1; j<m; j++)     //众多兔子逐渐成熟 
                unAct[j-1] = unAct[j];
            unAct[m-1] = actCount;    //可生育的兔子生小兔子 
        } 
        
        for(int i=0; i<m; i++){
            actCount = Add(actCount, unAct[i]);
        } 
        
        for(int i=actCount.length()-1; i>=0; i--)
            cout << actCount[i];
        cout << endl;
    } 
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值