sicily1029 Rabbit 中大OJ解题报告

由于中大的oj需要内网才能进去,就提供不了原始题目了,但是题目的意思就是说,开始有一对成年兔子,一对成年兔子每年能生一对幼兔,幼兔等m个月才成长为成年兔子,问d个月后总共有多少对兔子。

输入m d

     2 3

     3 5

     1 100

输出 5

     9

     100

题目意思相信大家都能明白,那么解题思路又是怎么样的呢

我来大概说一下,先找到兔子增长队列的公式,然后开一个字符串数组,把前一个计算出的结果保存起来,用于递推后一个结果。


把2 3|3 5这两个输入用结构图的形式写出来,你会发现他们的增长队列有一个共同的公式,能根据前面的结果把后面的结果递推出来

公式如下

              F(x)=F(x-1)+F(x-m);

其中m就是指多少个月幼兔成长为成年兔子

有了这条公式,就离成功解决这问题不远了。接着,很明显,这也是个大数加法的问题,因为兔子的增长实在是太快了,要算他们的总和就必须运用大数加法,将每一个月的兔子增长数目加起来,再加上最开始的那个兔子。

 

源码

 

#include<iostream>

using namespacestd;

//初始化

voidinitial(string &a,string &b){

       while(a.size()<b.size())a='0'+a;

       while(b.size()<a.size())b='0'+b;      

}

//删除第一个字符'0'

void del(string&a){

       if(a[0]=='0')

         a.erase(0,1);

}

//大数加法

stringbigItergeAdd(string a ,string b){

       initial(a,b);

       a='0'+a;

       b='0'+b;

       for(int i=a.size()-1;i>=0;i--){

              int num1=a[i]-'0';

              int num2=b[i]-'0';

              if(num1+num2>9){

                     a[i-1]=a[i-1]-'0'+1+'0';

                     a[i]=(num1+num2)-10+'0';

              }else{

                     a[i]=(num1+num2)+'0';

              }

       }

       del(a);

       return a;

}

typedef struct{

       string str;

}MyStr;

 

int main(){

       int m,d;

       while(scanf("%d%d",&m,&d)&&m!=0&&d!=0){

              MyStrmyStr[10024]={"0"};

              stringres="1",tmp="0",c="0";

              myStr[0].str="0";

              for(int i=1;i<=d;i++){

                     if(i<=m){

                            myStr[i].str="1";

                            res=bigItergeAdd(res,"1");

                            continue;

                     }

                     tmp=bigItergeAdd(myStr[i-1].str,myStr[i-m].str);

                     myStr[i].str=tmp;

                     res=bigItergeAdd(res,myStr[i].str);

              }

              cout<<res<<endl;

       }

       return 0;

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值