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

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

半片星河 4年前 回复TA
@半片星河 大佬们,帮忙看看吧,我实在是找不出哪儿有问题,答案我试了好几个都和正确的结果一样啊,那个gennumber[]是每一代牛的数量
DaTou 4年前 回复TA
dowhile 
下面那个for里面可以直接写  mother_cow[ input[j] ];
半片星河 4年前 回复TA
#include <stdio.h>
int number(int n);
int main()
{
	int n,gennumber[100]={0,1,1,1,1},total=0,i;
	scanf("%d",&n);
	if(n<55 && n>0){
		for (i=1;i<=n;i++)
		{
			gennumber[i]=number(i);
			total=total+gennumber[i];
		}
		printf("%d\n",total);
	}
	else if (n==0)
		;
	else
	printf("error\n");
	return 0;
}
	

int number(int n)
{
	int num;
	if (n<=4)
		num=1;
	else
		num=number(n-1)+number(n-3);
	return num;
}

为什么答案错误了
求解
小马虎本人 4年前 回复TA
@清絮 想问下scanf前面的~是干什么的
煮酒老麦 4年前 回复TA
@煮酒老麦 @Fantasy125 懂了,谢谢啦
天青色 4年前 回复TA
@煮酒老麦 若有不对,请轻喷
天青色 4年前 回复TA
@煮酒老麦 input[i++]存储输入值,输入为0时跳出;你给的程序问题在于int a[55]={1};只有a[0]=1,后面数组a的值都为0,输入第一个值后,i++,i=1,a[1]=0就会跳出循环,不满足循环条件。个人小白尝试修改: for (i = 0; input[i] != 0; i++) {         scanf("%d", &input[i]);         if (input[i]==0)         {             break;         }         input[i + 1] = 1;         getchar();     }
煮酒老麦 4年前 回复TA
可以解释一下如下语块是怎么运行的吗?
int i = 0;
    do
    {
        scanf("%d",&input[i]);
    }while(input[i++] != 0);
为啥我这样不可以:
int a[55]={1};
int i;
	for(i=0;a[i]!=0;i++){
		scanf("%d",&a[i]);
		getchar();
	}
请大佬赐教
清絮 4年前 回复TA
#include <stdio.h>
 main(){
int n,i;
int a[55]={0,1,2,3};
for(i=4;i<55;i++)
  a[i]=a[i-1]+a[i-3];
  while(~scanf("%d",&n))
  if(n==0) return ;
  else
	  printf("%d\n",a[n]);
}
成功
云憩风霞 4年前 回复TA
#include <stdio.h>
int main()
{
	int n,sum,s,i,j,a[55];
	sum=1;
	s=0;
	scanf("%d",&n);
	if (n==0)
	{
		printf("\n");
	}
	else if(n<=4)
	{
		sum=n;
		printf("%d",sum);
	}
	else if(n>=5)
	{
		sum=sum+4;
		a[0]=1;
		a[1]=1;
		a[2]=1;
		a[3]=1;
		a[4]=1;
		for (i=1;i<=n-4;i++)
		{
			s=a[0];
			for(j=1;j<=i;j++)
			{
				s=s+a[j];
			}
			a[i+4]=s;
			sum=sum+s;
		}
		printf("%d",sum);	
	}
} 
这样子答案我自己测试都是对的,为什么会判错