复杂度O(n*(n-3))
#include<iostream.h>
int main()
{
int n,i,sum
cout<<"输入测试年数,输0结束测试."<<endl
cin>>n
while( n ) //多余4年时母牛生的小牛会生小牛
{
if (n<5) //不足4年时母牛生的小牛不会生小牛
{
sum=1
sum += n
cout<<"第"<<n<<"年 共"<<sum<<"头"<<endl
cin>>n
}
else
{
sum = 4
for (i=n-3i>0 i--) //循环n-3次,最后三年生散穗祥的3头小族洞牛还不会生小牛
{
sum += i
}
cout<<"第"<<n<<"年 共"<<sum<<"头"<<endl
cin>>n
}
}
return 0
}
用递归效率低是正常的,毕竟频繁的函数调用是要占据大量的时间空间。如果该题不是一定要用递归算法的话,我给你个新的算法(肯定不会超时),但是代码我就不颂碰谈写了,因为很简单。
初始化 int cow_age[4] = {1, 0, 0, 0}分别代表出生1年、出生2年、出生3年、出生4年以后的母牛数目,最初有个出生1年的母牛(题目给出)。
然后设置循环变量i,i每自加一次就代表过一年,循环内容是
cow_age[3]+ = cow_age[2] //3岁的母吵瞎牛长到了4岁
cow_age[2] = cow_age[1] //2岁的母牛长到了3岁
cow_age[1] = cow_age[0] //1岁的母牛长到了2岁
cow_age[0] = cow_age[3] //每个野碰4岁以上的母牛生了一只1岁的小牛
总数就是 cow_age[0]+cow_age[1]+cow_age[2]+cow_age[3]。
理解应该没问题吧
我用递归的方法写了个, 非递归的方法暂时没想出来:#include <stdio.h>
void Cow(int* femaleCow, int n)
{
for(int i = 1 i <= n ++i)
{
*femaleCow += 1
if(i + 4 <= n)
Cow(femaleCow, n - (i + 4) + 1)
}
}
int main()
{
for(int i = 1 i <= 20 ++i)
{
int 槐闭femaleCow = 1
Cow(&femaleCow, i)
printf("第 %2d 年: %3d 头母牛\n", i, femaleCow)
}
}
也不能肯定对你的问题有没有理解对, 以下是渣野测试结果,你要的答案的第20年的:
第 1 年: 2 头母牛如明喊 // 第一头母牛加她生的小牛
第 2 年: 3 头母牛 // 依次类推
第 3 年: 4 头母牛
第 4 年: 5 头母牛
第 5 年: 7 头母牛 // 第一年生的小牛开始生了
第 6 年: 10 头母牛 // 第二年生的小牛也开始了
第 7 年: 14 头母牛
第 8 年: 19 头母牛
第 9 年: 26 头母牛
第 10 年: 36 头母牛
第 11 年: 50 头母牛
第 12 年: 69 头母牛
第 13 年: 95 头母牛
第 14 年: 131 头母牛
第 15 年: 181 头母牛
第 16 年: 250 头母牛
第 17 年: 345 头母牛
第 18 年: 476 头母牛
第 19 年: 657 头母牛
第 20 年: 907 头母牛
不知道你要的是不是这样的结果?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)