由于中大的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;
}