PTA习题4-11 兔子繁衍问题 (15 分)-好容易入坑

综述:

        刷了40多道题,论最坑爹的一道题我认为非兔子繁衍莫属,我刷这道题花了一整个下午,自认为我是对的,但是上传到PTA总是部分正确,最后屈服了在网上搜了下,最后终于发现问题:就是如何才算3个月,我所理解的3个月和题目描述的的三个月有所偏差,导致整个题做错。感觉题目描述不清不楚。

        在下文中我会将我理解的题目,分享一下想法和思路,以及题目正确的做法和思路。

题目 :

        一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

        输入在一行中给出一个不超过10000的正整数N。

输出格式:

        在一行中输出兔子总数达到N最少需要的月数。

输入样例:

30

输出样例:

9

问题 :

        这个题我犯的错误是,我认为1月到3月是3个月,3月到6月是3个月,也就是到了3月份初始的那对兔子生了一对兔子,3月出生的那对兔子到了6月才能生兔子。于是我就画出了下面的部分:

         根据我理解的意思我写出了如下代码:

代码1(我认为正确的实际不对的版本):

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);

	int time = 0;
	int sum = 1;
	int arr[100] = { 0 };
	do
	{
		time++;
		if (time < 3)
		{
			sum = 1;
			arr[time] = sum;
		}
		else if (time >= 3 && time < 6)
		{
			sum = sum + 1;
			arr[time] = sum;
		}
		else if (time >= 6)
		{
			sum = sum + arr[time - 3];
			arr[time] = sum;
		}

	} while (sum * 2 < n);
	printf("%d", time);
	return 0;
}

        以上代码经过调试和我预期结果一模一样,但是比较让人想骂人的是上传到PTA中只是部分错误,但是我坚决认为我的代码没有任何问题,于是白白浪费一下午在思考人生,从疑惑到愤怒再到平静,最终打开了百度~,看完搜索结果我名明白了大概我的和题目说的不同在哪里了,到5月份的时候3月份生的那胎就能继续生孩子了~~~而我一直认为是6月。

        题目的意思我画了另一幅图

        了解了这个地方之后代码就容易写出来了,稍微列几个就能发现规律,1月份1对,2月份一对,3月份2对,4月份3对,5月份5对,6月份8对..........也就是当前项是前边两项的和,如果同学们学过递归的话可能就知道了这个是一个斐波那契数列,知道这个地方这个题就很麻瓜了~~

代码2(正确的版本):

#include <stdio.h>
int fib(int x)
{
	if (1 == x)
	{
		return 1;
	}
	else if (2 == x)
	{
		return 1;
	}
	else if (x > 2)
	{
		return fib(x - 1) + fib(x - 2);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int time = 0;

	do
	{
		time++;
	} while (fib(time) < n);
	
	printf("%d", time);
	return 0;
}

总结:

        有三点要说:

1:这个题很SBBBBBBBBBBBBBBB

2:月份问题注意什么时候算3个月

3:兔子是对数不是数量

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝士就是菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值