母牛的故事(C语言)
题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6
题解代码一:
#include<stdio.h>
#define N 55 //定义最大数
int monther_cow[N]; //定义输出数组
void monther_cow2(int n); //声明
int main()
{
int input[N]; //定义输入数组,存储输入信息
monther_cow2(N); //直接调用枚举存储的函数,实现枚举过程
int i = 0;
do
{
scanf("%d",&input[i]);
}while(input[i++] != 0); //完成输入操作(先存入数组中,实现一口气输入,一口气输出,并非输入一个输出一个结果)
for(int j = 0 ; j < i-1 ; j++) //输出结果(循环次数=总的个数)
{
if( input[j] < 4) //个例
{
printf("%d\n",monther_cow[input[j]]); //直接调用函数计算结果输出
}
else
{
printf("%d\n",monther_cow[input[j] - 1] + monther_cow[input[j] - 3] ); //直接调用函数计算结果输出
}
}
return 0;
}
void monther_cow2(int n) //记录的斐波那契数列中对应的规律到数列 实现的计算方法
{
int i;
for(i = 1 ; i <= n ; i++)
{
if( i < 4)
{
monther_cow[i] = i;
}
else
{
monther_cow[i] = monther_cow[i - 1] + monther_cow[i - 3]; //规律总结,是前面一年和前面三年的总和
}
}
}
题解代码二:
#include<stdio.h>
int F(int n)
{
if(n<=3)
return n;
else
return F(n-1)+F(n-3);
}
int main()
{
int n,s;
while(scanf("%d",&n) && n)
{
s=F(n);
printf("%d",s);
}
return 0;
}
//简单实现方法,不过未设置存储数组,边输入边输出(不符题意)
//且反复调用递归(易超时),忽略了条件(n的取值范围意义)
结构:
1.输入:
- do while(跳出条件) 语句
- 数组存储输入信息(一口气存储,一口气输出)
2.实现算法:
- 设置枚举函数,先计算好所有数值对应的结果存储好,直接调用(避免重复调用)
3.输出:
- 对应数组大小,设置循环次数
- 输出直接使用实现算法的函数计算的的值(已存储在数组中,直接调用对应的数组即可)
总结:
- 主要用了“斐波那契数列”的知识来解答
- 函数递归来解题,导致时间超时,问题是由于每次解答一题要递归好几次
- 题目中的 0<n<55头牛的条件没用上,所以换个思路,先循环一次把到55头牛在斐波那契数列中的排列记录下来,之后解题时候调用数列就快了很多。
- 总体使用了两个数组(一个存储输入信息,一个存储算法函数计算出的结果值),一个算法实现函数(monther_cow2(int n)),主函数先调用算法实现函数实现枚举,再输入,输出
- 重要在于先枚举,总结出规律,设计算法