原题链接:[递归]母牛的故事
题目:
描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 n 年的时候,共有多少头母牛?
输入:
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数 n(0<n<55),n 的含义如题目中描述。
n=0 表示输入数据的结束,不做处理。
输出:
对于每个测试实例,输出在第 n年的时候母牛的数量。
每个输出占一行。
分析:
我们先列出一个表格,把每一年对应的母牛数量写出来。
| 第 n年: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| f[n] 头牛: | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 |
先看第 4 年,对应有 4 头母牛,4 = 3+1;
再看第 5 年,对应有 6 头母牛,6 = 4+2;
最后看第 6 年,对应有 9 头母牛,9 = 6+3;
没错,是有规律的,该年母牛的数量就是一年前的数量再加上三年前的数量,
用公式表示就是 f[n] = f[n-1] + f[n-3]
参考代码:
迭代法:
先给出用迭代法的代码,因为它长
#include<iostream>
using namespace std;
int main()
{
int n, i;
int f1, f2, f3, fn;
while (cin >> n && n != 0) //输入 n 的值,且 n 不等于0,则进入,否则退出
{
f1 = 1;
f2 = 2;
f3 = 3;
if (n == 1)
cout << f1 << endl;
else if (n == 2)
cout << f2 << endl;
else if (n == 3)
cout << f3 << endl;
else
{
for (i = 4; i <= n; i++)
{
fn = f3 + f1;
//把该年迭代为一年前,一年前迭代为两年前,依次类推
f1 = f2; //f1代表 3 年前
f2 = f3; //f2代表 2 年前
f3 = fn; //f3代表 1 年前
}
cout << fn << endl; //fn
}
}
return 0;
}数组:
最后给出用数组的,用数组相对来说会好一点,因为迭代一次,然后就可以输出了。上面那个代码每输入一个数都需要重新迭代,数量大且多的话,花费的时间会比较多。
#include<iostream>
using namespace std;
int main()
{
int n, i;
int f[55] = { 0,1,2,3 }; //f[0]=0,f[1]=1,f[2]=2,f[3]=3
for (i = 4; i < 55; i++)
f[i] = f[i - 1] + f[i - 3];
while (cin >> n && n != 0) //输入 n 的值,且 n 不等于0,则进入,否则退出
{
cout << f[n] << endl;
}
return 0;
}0.0分
211 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<iostream> using namespace std; int main(){ int n;//n为年数 int f[54]={1,2,3,4};//f[0]表示第一年,f[1]表示第二年,.... while(cin>>n&&n!=0){ f[n-1]=f[n-2]+f[n-4]; cout<<f[n-1]; } return 0; } 这运行都能通过,但是测试平台说有错误#include<cstdio> #include<string.h> int num(int y) { int f=0; if(y<=4) { f=f+y; return f; } else { f=num(y-3)+num(y-1); } } int main() { int n[101],i=0; while(1) { scanf("%d",&n[i]); if(n[i]==0) break; i++; } for(int j=0;j<i;j++) { printf("%d\n",num(n[j])); } return 0; }#include<stdio.h> int main() { int k, t[4], Max, Num[54], i; for (k = 0; k < 4; k++) { scanf("%d", &t[k]); getchar(); } for (k = 0; k < 4; k++) { int Result = 0; if (t[k] <= 0 || t[k] >= 55) { printf("\n"); } else { Num[0] = Max = t[k]; for (i = 1; i < Max; i++) { if (t[k] - i - 3 > 0) { Num[i] = t[k] - i - 3; } else { Num[i] = 0; } } for (i = 0; i < Max; i++) { Result += Num[i]; } printf("%d\n", Result); } } return 0; } 为啥错了呀?#include<iostream> #include<cstdlib> using namespace std; int Fab(int n) { if(n==1) cout<<1<<endl; else if(n==2) cout<<2<<endl; else if(n==3) cout<<3<<endl; else { return Fab(n-1)+Fab(n-3); } } int main() { int n; cin>>n; if(n==1) return 0; else cout << Fab(n) << endl; system("pause"); return 0; }哪里错了呀#include<stdio.h> int main () { int i,n; int a[55]={0,1,2,3}; scanf("%d",&n); if(n==1) printf("%d\n",a[n]); else if(n==2) printf("%d\n",a[n]); else if(n==3) printf("%d\n",a[n]); else if(n==0) printf(" "); else { for(i=4;i<=n;i++) { a[i]=a[i-3]+a[i-1]; } printf("%d\n",a[n]); } }我这个有啥问题吗?答案显示我结果错误,但是运行结果是正确的啊