我这儿有了两种方法,无论使用哪种方法你都要抓住当年母牛生下的小牛与几年前的母牛数(也就是当年的成熟牛)是相等的这个规律,数组法会受到题目所给出的年数的局限,比较浪费空间,递推法的则更需要理解内部的规律。

数组法

#include<stdio.h>

int main(){

    int n,count=0;

    int i;

    while(scanf("%d",&n)&&n)

    {

    int a[56];

    for(i=1;i<56;i++)

    {

    if(i<=4)

    a[i]=i;

    else

    a[i]=a[i-1]+a[i-3];

}

printf("%d\n",a[n]);

    }

    return 0;

}

递推法

#include <stdio.h>

int main()

{

int n,i;

while(scanf("%d",&n)&&n)

{

int num[3]={1,2,3};

for(i=1;i<n/3.0;i++)

{

num[0]+=num[2];

num[1]+=num[0];

num[2]+=num[1];

}

printf("%d\n",num[(n-1)%3]);

}

return 0;

}


点赞(13)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 7 条评论

Meira 5年前 回复TA
我跟你一样的思路,但是试了好多while判断语句都无法正常使用,只有你这个能用,我不太明白为什么不能用scanf的返回值==1之类的做法
君应怜 5年前 回复TA
这个递推法牛逼了
  1   2    3
  4   6    9
13  19  28
41   60  88
for循环中用隐式类型转换控制住了循环叠加1次
使用取余完美取出数字,不占用太多额外空间
做到45度俯视 7年前 回复TA
好厉害,非常感谢
Kiku 7年前 回复TA
@Smelless 所以  n/3.0就是计算这是第几个三年;而(n-1)%3则是就算这是三年中的第几年
Kiku 7年前 回复TA
@Smelless 你要能看出某年母牛数量与年数有个周期为3的规律:下一个三年中的第一年等于这个三年中的第一年母牛数加这上一个三年中第三年的母牛数;下一个三年中的第二年等于这个三年中的第二年加上下个三年中的第一年;下个三年中的第三年等于这个三年中的弟三年加上下个三年中的第二年
Smelless 7年前 回复TA
@Smelless 还有这个 num[(n-1)%3]
Smelless 7年前 回复TA
for(i=1;i<n/3.0;i++) 中的 i<n/3.0 是什么意思?