题目:
描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 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分
319 人评分
f(n) = f(n - 1) + f(n - 3) 的规律可以用数学化一点的推导公式吗?直接由前面几个得到规律有点看不懂。
盐于律己 2020-03-29 14:16:43 |
你可以用带值的方法来理解
这实际上是错误的,代码没有完全实现题目的要求:”输入数据由多个测试实例组成,每个测试实例占一行,“。题目要求先是把所有的输入数据输入以后,然后再把每一个n所对应的答案再一行一行输出,这个是输一次出一次结果,实际上并不能算对,但是测试却给通过
我第一遍是这样写的,函数递归的方式,提示超时 #include <iostream> int count = 1; int fun(int n) { if (n == 1) count = 1; else if(n == 2) count = 2; else if(n == 3) count = 3; else count = fun(n-1) + fun(n-3); return count; } int main() { int n; while(std::cin>>n && n!=0) fun(n); std::cout<<count<<std::endl; return 0; }
C语言123 2019-09-13 20:25:56 |
+1
Lthero 2019-09-30 18:59:10 |
差不多,系统提示我:答案错误
hhhhhza 2019-10-10 00:08:18 |
我也这么写的,他说我超时了
JJJoker 2019-10-22 19:45:01 |
可以采用记忆搜索
jiangers 2020-01-05 22:35:22 |
while(std::cin>>n && n!=0) { fun(n); std::cout<<count<<std::endl;}
逝我非我 2020-01-29 21:54:43 |
记忆化搜索
我有一点不解,请教一下楼主。 这样写是对的: int f1, f2, f3, f4; int years, i; while(cin>>years && years !=0) { f1 = 1; f2 = 2; f3 = 3; 这样写是错的: int f1=1, f2=2, f3=3, f4; int years, i; while(cin>>years && years !=0) { 请教一下原因
为啥第一年只有一头牛,不应该是初始的牛仔第一年生产了一头小牛嘛
#include<iostream> using namespace std; int count(int *a,int i,int n){ int sum=0; a[i]=a[i-1]+a[i-3]; sum+=a[i]; i++; if(i==n) return sum; else return count(a,i,n); } int main(){ int a[100]={1,2,3,4},n; while(cin>>n&&n!=0){ int sum; if(n==4) cout<<a[3]<<endl; else if(n==3) cout<<a[2]<<endl; else if(n==2) cout<<a[1]<<endl; else if(n==1) cout<<a[0]<<endl; else{ sum=count(a,4,n); cout<<sum<<endl; } } return 0; } 不知道还有没有人看评论 我的一直报错答案错误,可是我试了一下上面的程序,答案一样啊,有人帮忙解答一下吗
数列 (C++代码)浏览:707 |
大神老白 (C语言代码)浏览:691 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:732 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:1292 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:592 |
数对 (C语言代码)浏览:762 |
数组与指针的问题浏览:760 |
蛇行矩阵 (C语言代码)浏览:559 |
简单的a+b (C语言代码)浏览:683 |