母牛的故事(C语言)

母牛的故事(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.输出:

  • 对应数组大小,设置循环次数
  • 输出直接使用实现算法的函数计算的的值(已存储在数组中,直接调用对应的数组即可)

总结

  1. 主要用了“斐波那契数列”的知识来解答
  2. 函数递归来解题,导致时间超时,问题是由于每次解答一题要递归好几次
  3. 题目中的 0<n<55头牛的条件没用上,所以换个思路,先循环一次把到55头牛在斐波那契数列中的排列记录下来,之后解题时候调用数列就快了很多。
  4. 总体使用了两个数组(一个存储输入信息,一个存储算法函数计算出的结果值),一个算法实现函数(monther_cow2(int n)),主函数先调用算法实现函数实现枚举,再输入,输出
  5. 重要在于先枚举,总结出规律,设计算法
  • 16
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值