题目:
描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 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 人评分
请教一下,为什么在VS2019可以,在这报错误0? #include<iostream> using namespace std; int main() { int F[55] = { 0,1,2,3 }; int n; cin >> n; for (int i = 4; i <= n; i++) F[i] = F[i - 1] + F[i - 3]; switch (n) { case 1: case 2: case 3: cout << n << endl; break; default:cout << F[n] << endl; } return 0; }
#include<iostream> using namespace std; int fun(int x) { if (x <= 3) return x; else return fun(x - 1) + fun(x - 3); } int main() { int x; while ((cin >> x) && x) { cout << fun(x) << endl; } return 0; } c++语法写的一直运行超时,改成C语言写就能通过,这是怎么回事啊!!!
lmx 2022-03-10 10:02:15 |
把输入输出换成c语言的就可以了,c++的是输入输出对象,相对于函数还是要慢一点。
Luftmensch 2022-03-12 08:51:32 |
感谢
葫芦娃救爷爷 2022-03-20 23:22:24 |
cin 的时间要比scanf长很多
#include <stdio.h> int f(int n) { if(n<=4) return 1; else return f(n-1)+f(n-3); } int main() { int n; long long sum=0; while(scanf("%d",&n)&&n!=0) { if(n>0&&n<55) { while(n) { sum+=f(n); n--; } } printf("%d\n",sum); sum=0; } } 救命,运行超时
#include <stdio.h> int DOT(int n) { if (n <= 4) { return n; } else { return DOT(n - 1) + DOT(n - 3); } } int main() { int n=0,i=0; int array[4] = { 0 }; while(i<=55) { scanf_s("%d", &array[i]); if (array[i] == 0)break; i++; } n = i; i = 0; while (i<=n) { printf("%d\n", DOT(array[i])); i++; } return 0; } 这是错误的,但是为什么?
CHOSEN 2021-03-24 21:45:27 |
#include <iostream> using namespace std; int Count(int a){ if(a<=3) return a; else return Count(a-1)+Count(a-3); } int main() { int m,n; while(cin>>m && m!=0){ n=Count(m); cout<<n<<endl; } cout<<endl; return 0; }
CHOSEN 2021-03-24 21:46:23 |
明明我感觉很简洁,平台却说运行超时~~~
xisoni 2021-03-29 18:53:40 |
可能因为递归的原因,递归效率比较低,我的也是。
#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; }
P1001 (C++代码)浏览:823 |
点我有惊喜!你懂得!浏览:1273 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:610 |
数组输出 (C语言代码)浏览:811 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:623 |
C语言训练-字符串正反连接 (C语言代码)浏览:664 |
printf基础练习2 (C语言代码)浏览:605 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:561 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:588 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:900 |
孤寡孤寡 2022-04-30 09:28:59 |
自己找到了,要输出多个#include<iostream> using namespace std; int main() { int F[55] = { 0,1,2,3 }; int n; while (cin >> n && n!=0) { for (int i = 4; i <= n; i++) F[i] = F[i - 1] + F[i - 3]; switch (n) { case 0: case 1: case 2: case 3: cout << n << endl; break; default:cout << F[n] << endl; } } return 0; }