解题思路:
注意事项:
参考代码:
题目分析
根据题意,先列出前几年的牛头数,试着找找规律:
在列出这个序列的过程中,应当能找出规律。
以n=6为例,fn=9头牛可以分解为6+3,其中6是上一年(第5年)的牛,3是新生的牛(因为第3年有3头牛,这3头在第6年各生一头牛)。
我们可以得出这样一个公式:fn=fn-1+fn-3。再理解一下,fn-1是前一年的牛,第n年仍然在,fn-3是前三年那一年的牛,
但换句话说也就是第n年具有生育能力的牛,也就是第n年能生下的小牛数。编程序,求解这个公式就行了。
当然,第1-3年的数目,需要直接给出。很像斐波那契数列,有不一样之处,道理、方法一样。其实,在编程之前,讲究先用这样的方式建模。
**迭代法求解**
#include <iostream> using namespace std; int main() { int n,i; int f1, f2, f3, fn; while(cin>>n&&n!=0) { //下面求第n年有几头牛 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; } } return 0; }
**数组求解**
#include<bits/stdc++.h> using namespace std; int main() { int n,f[56]= {0,1,2,3}; for(int i=4; i<=55; i++) { f[i]=f[i-1]+f[i-3]; } while(cin>>n&&n!=0) { cout<<f[n]<<endl; } return 0; }
0.0分
80 人评分
#include<stdio.h> int main() { int n,x; scanf("%d",&n)'' if(n=0) return false; if(n<4) x=1; if(n>=4) x=n-2; printf("%d",x) return 0; } 这种可以吗
#include<iostream> using namespace std; int cow(int i) { //返回第i年母牛总数 if (i <= 4) return i == 0 ? 0 : i; else return (cow(i - 1) + cow(i - 3)); } int main() { int i; while (cin >> i) { if (i == 0) //若输入为0则跳出循环 break; else cout << cow(i) << endl; } return 0; } 结果是对的, 就是时间超了. 就当辅助理解递归把.. 看一乐..
#include<stdio.h> int main() { int a; int i; int f[55]={0,1,2,3}; for(i=4;i<55;i++){ f[i]=f[i-1]+f[i-3]; } scanf("%d",&a); if(a<55&&a!=0){ printf("%d\n",f[a]); } return 0; } 哪里错了呢,欲哭无泪
小马虎本人 2020-04-06 16:27:59 |
应该是没弄循环输入和a=0时结束循环吧
我想问一个很蠢的问题: 第八年的时候,不是有5个可以生育的大奶牛吗? 再加上前面的13,等于18,我前面按照这个思路计算正常,一到第八年就错了,请问是什么原因?
你的全世界 2020-02-18 09:19:41 |
因为第5年是6个牛,第4年是4个牛,多出来两个牛,两个牛一头生一个不就是两头了,所以按你的思路第8年是19头
dotcpp0744682 2024-03-27 17:00:53 |
第八年是十六头吧?那一年有三头牛可以生小牛所以应该是加三头牛吧?
#include<stdio.h> int main() { int nb(int n); int n,c; scanf("%d",&n); c=nb(n); printf("%d",c); return 0; } int nb(int n){ int c; if(n==1) c=1; else if(n==2) c=2; else if(n==3) c=3; else c=nb(n-1)+nb(n-3); return c; } 为啥显示结果错误呢,求解惑
a成成成 2020-02-10 20:10:40 |
多组测试,不是单组测试.
#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; } 不知道还有没有人看评论 我的一直报错答案错误,可是我试了一下上面的程序,答案一样啊,有人帮忙解答一下吗
浅枫 2019-09-08 20:30:20 |
数组中应该是0123.你的是1234.可能是这里错了
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:1271 |
C二级辅导-统计字符 (C语言代码)浏览:1062 |
C语言程序设计教程(第三版)课后习题7.3 (C++代码)浏览:697 |
C语言程序设计教程(第三版)课后习题6.7 (C++代码)浏览:1160 |
C二级辅导-等差数列 (C语言代码)浏览:628 |
C语言程序设计教程(第三版)课后习题9.2 (C语言代码)浏览:741 |
C语言程序设计教程(第三版)课后习题12.1 (C语言代码)浏览:1026 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:773 |
程序员的表白 (C语言代码)浏览:706 |
【计算直线的交点数】 (C语言代码)浏览:1501 |
小夭 2021-03-15 09:49:43 |
肯定不行啊,条件你没有看清,这是牛生牛接着生牛的问题