题目:
描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 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 人评分
#include<stdio.h> int Cowsnumber(int n); int main() { int n; do { scanf("%d",&n); printf("%d\n",Cowsnumber(n)); }while(n!=0); return 0; } int Cowsnumber(int n) { if (n<=4) { return n; } //第一头小牛未满四年 else { return Cowsnumber(n-1)*2-(Cowsnumber(n-1)-Cowsnumber(n-3)); } }
#include<iostream> using namespace std; int main() { int n; int f[55]={0,1,2,3}; while(cin>>n && n!=0){ for(int i=4; i<=n; i++){ f[i] = f[i-1] + f[i-3]; } cout<<f[n]<<endl; } return 0; }
#include<iostream> #include<vector> #define MATUREAGE 4 using namespace std; int main() { int year=0, cowNum=0; cin >> year; vector<int>age; cowNum = 1; age.push_back(MATUREAGE); for (int i = 2; i <= year; i++) { int numplus = 0; for (int j = 0; j < cowNum; j++) { age[j] += 1; if (age[j] >= MATUREAGE) { numplus++; } } cowNum += numplus; for (int k = 0; k < numplus; k++) { age.push_back(1); } } cout << cowNum << endl; return 0; }请问大佬们这个代码行吗
我推出一个公式可以算出来哪年有多少个,为什么代码不对?第n年有{4+(n-1)(n-4)/2}头(n>4) 代码: #include<bits/stdc++.h> using namespace std; int main(){ int n; while(n) cin>>n; if(n<=4){ cout<<n<<endl; } else cout<<4+(n-1)(n-4)/2<<endl; return 0; }
#include<iostream> using namespace std; int a(int i); int main() { int b[255]; int i,j=0; for( i=0;i<255;i++) { cin>>b[i]; if(b[i]==0) break; } for( j=0;j<i;j++) { cout<<a(b[j])<<endl; } } int a(int i) { if(i>1) { return ((i+1)/3)+a(i-1); } if(i==1) { return 1; } } C++的代码,但是评分是一个对一个错,这个错的是哪有错
xxxss 2023-12-10 12:16:39 |
a函数错了,i>1的返回表达式找错规律了,从6开始就错了
请教一下,我写的错在哪了 #include<iostream> using namespace std; int f(int n){ if (n<4){ return n; }else if(n=0){ return 0; }{ return f(n-1)+f(n-3); } } int main() { int n,a,b,c; cout <<"请输入"<<endl; cin >> n ; cin >> a ; cin >> b ; cin >> c ; // cout << f(n) << '\040' << f(a) << '\040' << f(b) <<endl; cout << f(n) <<endl; cout << f(a) <<endl; cout << f(b) <<endl; cout << f(c) <<endl; return 0; }
dotcpp0676098 2023-06-27 11:15:16 |
#include<iostream> using namespace std; int f(int n){ if(n==0){ return 0; } if (n<4){ return n; }else { return f(n-1)+f(n-3); } } int main() { int n,a,b,c; cout <<"请输入"<<endl; cin >> n ; cin >> a ; cin >> b ; cin >> c ; cout << f(n) << ' ' << f(a) << ' ' << f(b) << ' ' <<f(c) <<endl; // cout << f(n) <<endl; // cout << f(a) <<endl; // cout << f(b) <<endl; // cout << f(c) <<endl; return 0; }
大佬们,这里的f[55]是数组,所以后面{}里的元素个数不应该和[]里的数组长度一样吗?可这里为什么{}只有四个元素(纯小白,望讲解)
帆 2023-06-19 16:52:36 |
课本上说可以只给一部分元素赋初值,后面默认为零。(时间这么久了,应该已经知道了)
求圆的面积 (C++代码)这里推荐使用宏定义浏览:2028 |
printf基础练习2 (C语言代码)浏览:3404 |
点我有惊喜!你懂得!浏览:1273 |
C二级辅导-分段函数 (C语言代码)浏览:583 |
C二级辅导-统计字符 (C语言代码)浏览:528 |
C二级辅导-进制转换 (C语言代码)浏览:657 |
大小写转换 (C语言代码)浏览:904 |
ASCII帮了大忙浏览:797 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:1114 |
C语言训练-求PI* (C语言代码)浏览:637 |
江下雨天 2024-09-05 13:19:23 |
c语言实现