题目:
描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 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分
310 人评分
#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]); } }我这个有啥问题吗?答案显示我结果错误,但是运行结果是正确的啊
#include<stdio.h> int main(){ int f1,f2,f3,fn,n,i; // f1=1;f2=2;f3=3; while(scanf("%d",&n)&&n!=0){ f1=1;f2=2;f3=3; if(n==1) printf("%d",f1); else if(n==2) printf("%d",f2); else if(n==3) printf("%d",f3); else if(n>=4){ for(i=4;i<=n;i++){ fn=f1+f3; f1=f2; f2=f3; f3=fn;} printf("%d",fn); }}} 这个错哪里了啊 运行结果对 显示答案错误
SILLYBOY 2020-02-25 17:39:25 |
我改了几次,才发现你没有换行;然后造成输出格式错误,就给你判错了
#include<stdio.h> void main() {int a=1,b=2,c=3,d,n; scanf("%d",&n); if(n!=0) { if(n==1) printf("%d",a); else if(n==2) printf("%d",b); else if(n==3) printf("%d",c); else {for(int i=4;i<=n;i++) {d=a+c; a=b; b=c;c=d;} printf("%d",d); }} else printf("您输入的数据错误"); } 我这么写运行出来的结果没错啊,为什么系统说答案错误呢
咕咕咕鸽 2020-02-13 09:20:07 |
你画蛇添足,没让你输出“您输入的数据错误”
#include<stdio.h> int main(){ int all[56]={ 1,2,3,4 }; for(int i=4;i<56;i++){ all[i]=all[i-1]+all[i-3]; } while(true){ int num; if(num==0){ break; } scanf("%d",&num); printf("%d\n",all[num-1]); } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { int n,a[100]={0,1,2,3},sum=0,i; scanf("%d",&n); for(i=4;i<=n;i++) { sum=a[i-1]+a[i-3]; a[i]=sum; } printf("%d",sum); return 0; }
f(n) = f(n - 1) + f(n - 3) 的规律可以用数学化一点的推导公式吗?直接由前面几个得到规律有点看不懂。
盐于律己 2020-03-29 14:16:43 |
你可以用带值的方法来理解
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:619 |
拆分位数 (C语言代码)浏览:1326 |
【出圈】 (C语言代码)浏览:794 |
C语言考试练习题_排列 (C语言代码)浏览:719 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:587 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:667 |
Hello, world! (C++代码)浏览:1744 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:780 |
Tom数 (C语言代码)浏览:525 |
勾股数 (C语言代码)浏览:799 |
慢七分 2021-01-27 13:43:52 |
输入的是一组数据吧
伽马 2021-04-11 10:56:43 |
输入的就对不上,而且题目要求的是n=0的时候才结束输入,且不做处理