这个题目挺有意思的,我主要用了“斐波那契数列”的知识来解答的,但是发现了问题。

1、我用了函数递归来解题,导致时间超时,问题是由于每次解答一题要递归好几次。

2、题目中的 0<n<55头牛的条件没用上,所以换个思路,先循环一次把到55头牛在斐波那契数列中的排列记录下来,之后解题时候调用数列就快了很多。

结果在网页编译通过,答题正确。

#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];
		}
	   
	}
}


点赞(286)
 

0.0分

124 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 156 条评论

十三 5年前 回复TA
@MrQ n没有初始化
煎饼不夹火腿 5年前 回复TA
#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[60];
    int year=1;
    while(year!=0)
    {
    scanf("%d",&year);
    for(int i=1;i<4;i++)
        a[i]=i;
    for(int i=4;i<=year;i++)
        a[i]=a[i-1]+a[i-3];
        printf("%d\n",a[year]);
    }
}
有没有大佬帮我看看哪里错了 跪谢
12039 5年前 回复TA
#include<stdio.h>
int milk(int n)
{
    int sum;
    sum=0;
    if(n>4)
    sum=n+milk(n-4);
    else
        sum+=n;
    return sum;
}

int main()
{
    int a;
    while(~scanf("%d", &a))
    {
        if(a!=0)
        {
            printf("%d\n",milk(a));
        }
        else
            break;
    }
    return 0;
}
我的哪错了;说错了一半
追梦少年 5年前 回复TA
666好方法
神鬼一刀流 5年前 回复TA
@少侠 n=0时是不是出现问题了(与题意不符)?scanf(“%d”,&n)当n=0时函数返回为1会进入while循环,改成这样可还行while(scanf(“%d”,&n)&&n)
柚子都没我甜 5年前 回复TA
@君莫笑 我也想知道....
老顽童2333 5年前 回复TA
@少侠 挺好的,但是第二行好像少了个int,然后while下面的F(n)单独一行那个可以删掉
少侠 5年前 回复TA
#include<stdio.h>
int F(n)
{
	if(n<=3)
	return n;
	else
	return F(n-1)+F(n-3);
}
int main()
{
	int n;
	while(scanf("%d",&n))
	{
	F(n);
	printf("%d ",F(n));
	}
	return 0;
}
//大家看看有没有什么不严谨的地方
少侠 5年前 回复TA
@王矮矮唉 我理解了,这是最后递归结果的输出!
少侠 5年前 回复TA
@王矮矮唉 @1351347325 if (memo[n]) 	{ 		return memo[n]; 	}   //请问这一句有什么用?