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

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 条评论

sky.刑天 4年前 回复TA
@小明的猫 正确答案是这个,你的错因是:f_s函数里的for循环如果写成for(i=4,i<n,i++),这样只能求到f(n-1),所以你的结果总会差一位。
sky.刑天 4年前 回复TA
@小明的猫 int f_s(int n,int f[]) { 	int i=0; 	f[1]=1; 	f[2]=2; 	f[3]=3; 	for(i=4;i<n+1;i++){ 		f[i]=f[i-1]+f[i-3]; 	} 	return f[n]; } int main(){  	int n[55]={0}; 	int f[55]={0}; 	int i=0; 	int k=0; 	for(i=0;i<55;i++)     {     	scanf("%d",&n[i]);     	if(n[i]==0)     	break;     	k++; 	} 	for(i=0;i<k;i++) 	{ 		printf("%d
",f_s(n[i],f)); 	 } }
小明的猫 4年前 回复TA
#include<stdio.h>
int f_s(int n,int f[])
{
	int i=0;
	f[1]=1;
	f[2]=2;
	f[3]=3;
	for(i=4;i<n;i++){
		f[i]=f[i-1]+f[i-3];
	}
	return f[n];
}
int main(){
    
	int n[55]={0};
	int f[55]={0};
	int i=0;
	int k=0;
	for(i=0;i<55;i++)
    {
    	scanf("%d",&n[i]);
    	if(n[i]==0)
    	break;
    	k++;
	}
	for(i=0;i<k;i++)
	{
		printf("%d\n",f_s(n[i],f));
	 } 
} 
为啥不对求指教
Demmo 4年前 回复TA
@神荼 每年的母牛数量通过递推得来,这里给出的通项公式并不正确
dongfang 4年前 回复TA
#include <stdio.h>
int main(void)
{
	int a, b, c, d, e;
	
	int i, t, n;
	while(~scanf("%d", &n))
	{
		if (n < 55 && n > 0)
		{
			a = 0;
			b = 1;
			c = 0;
			d = 0;
			e = 0;
			for (i = 1; i <= n; ++i)
			{
				a = b + c + d + e;
				b = b + c;
				t = b;
				c = d;
				d = e;
				e = t;
			}
			printf("%d\n", a);
		}
	}
	return 0;
}
zsai 4年前 回复TA
@云憩风霞 你这只能读取一次,没循环
神荼 4年前 回复TA
#include<stdio.h>
int main() {
    int n, l, k = 0, m = 0, i = 1;
    int s[55];
    do{
        scanf("%d", &n);
        if(n > 0 && n < 55) {
            while(n > 0) {
                if(n <= 4) {
                    m = n;
                    break;}
                else if(n > 4) {
                    m = ((n-1)*(n-4))/2+4;
                    break;}
            }
            s[k] = m;
            k++;
        }
        else if(n = 0) {
            break;}
    }while(n != 0);
    for(l = 0; l < k; l++) {
        printf("%d\n", s[l]);}
    return 0;
}
答案错误5555,求哥哥们指点迷津啊。
念之森蓝 4年前 回复TA
@清絮 这个是scanf的用法
犹豫就会白给 4年前 回复TA
@犹豫就会白给 自己看错了,sorry
犹豫就会白给 4年前 回复TA
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;
}
为什么要 input[i++]!=0  j<i-1 ,我写成 input[i]!=0  j<i 编译没错 但结果是错的,没有输出结果