关于斐波那契数列及其变式相关问题的思考

学过编程的人对斐波那契数列应该是相当熟悉了,无论是上机还是平常练习都容易遇到。当然问题的解法也相当简单,最原始的f(n)=f(n-1)+f(n-2),即第n年底的兔子总数等于第n-1底年兔子总数加上在第n年具有生育能力的兔子数(假设一年成熟,即该数等于第n-2年底兔子总数)。
但是我们都知道这只是理想状态,兔子也有生老病死,那么把这些状态加入,想用上面的方法就不太容易了,例如下题:
艾露猫很可爱,但是寿命只有短短的20年,艾露猫在出生后2年成年,且成年时每对艾露猫都会在年初产下一对小猫,艾露猫成年10年后进入老年,老年持续8年后遗憾地去世。
现在SkyLee得到了一对可爱的艾露猫,他希望艾露猫越多越好,这样打起龙来就很轻松了。假设艾露猫很传统,都是一夫一妻制,并且生出的小猫也正好为一对,若现在为第1年年初,那么第n年SkyLee一共能有多少只可爱的艾露猫呢?(时间限制:1000ms 内存限制:65536kb)
输入:第一个数为数据组数T,接下来T行,每行1个整数n(保证艾露猫数量不超过int)
输出:对于每组数据,输出一行,为第n年艾露猫的数量
这种题目太真实了,反而规律不太好找,要是一年一年的统计算20几次。。。
所以,还是模拟一下比较好吧(奸笑)
已知幼年期是1-2年,生育期是3-12年,老年期是13-20年然后去世。我们可以设置一个数组a[21]表示在每一年龄段的人数,然后不断更新到目标年份最后求和即可;
举例:第一年:a[1]=1;
第二年:a[1]=0,a[2]=1;
第三年:a[1]=1,a[2]=0,a[3]=1;
……
即每过一年a[i]=a[i-1] (1<i<=20),而新出生的a[1]等于处于生育年龄a[3]到a[12]的总和。
到达目标年份后求和a[1]到a[20]即可。
C语言代码实现如下:

#include<stdio.h>
int a[21];
void move_update(int a[]){
	int i;
	for(i=20;i>=2;i--)a[i]=a[i-1];
	a[1]=0;
	for(i=3;i<=12;i++)a[1]+=a[i];
	return;
}
int getsum(int a[]){
	int i,sum=0;
	for(i=1;i<=20;i++)sum+=a[i];
	return sum;
}
int main(){
	int T,n,i,j;
	scanf("%d",&T);
	while(T--){
		a[1]=1;
		for(i=2;i<=20;i++)a[i]=0;
		scanf("%d",&n);
		for(i=2;i<=n;i++){
			move_update(a);
		}
		printf("%d\n",2*getsum(a));
	}
}

题目中最后问是多少只,故乘以2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值