[递归]母牛的故事

题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6

#include<stdio.h>
int main()
{
	int n=1;//n代表年份 
	int number=0;
	int a[60];
	a[1]=1;
	a[2]=2;
	a[3]=3;
	a[4]=4;
		for(int i=5;i<60;i++)
{
		    a[i]=a[i-3]+a[i-1];
}
	while(1) 
	{
		scanf("%d",&n);
		if(n==0)
		{
			break;
		}
		number=a[n];
		printf("%d\n",number);
	}
	 return 0;
} 

解答这道问题,我们首先要把母牛递增的规律找出来。
在这里插入图片描述
我们可以发现,有一个规律,当年份为n时(n>4),母牛的数量number就等于n-1年份母牛的数量+n-3年份母牛的数量。
我们可以定义一个60位的数组,这个数组的前4项是确定的值,a[1]=1;a[2]=2;…。当n>4时a[n]=a[n-3]+a[n-1];
我在写这道题的时候出现了一个小bug,就是在while的判断框中,条件的选择,我一开始选的是while(n!=0),但是这样写会有一个bug,当输入值为“0”时,由于scanf在while的判断框内部,且接下来就是printf,所以一定会导致当输入“0”后,跳过了while(x!=0)的判断条件,紧接着输出,就与题目条件不符。为了解决这个问题,我想到了两种解决方案。
1
把while判断框内值改为常量1,这样就会一直进入循环,然后下来输入n的值,接下来加入一个判断框,if(n==0) break;,当n的值为0时,停止输出,break;
2
while( ~scanf("%d",&n) && n)
1.scanf函数的返回值问题
eg: scanf("%d%d",&a,&b);
scanf的返回值是输入值的个数
  ①如果a和b都被成功读入,则scanf的返回值为2。
  ②如果只有a被成功读入,那么返回值为1。
  ③如果a和b都未被成功读入,那么返回值就为0。
  ④如果遇到错误或遇到end of file,返回值为EOF,EOF一般(不是标准)为-1。
2.~的含义
~是按位取反,如果scanf函数没有输入值或输入错误就是返回-1,-1按位取反结果是0。
while(~scanf("%d", &n))就是当没有输入的时候退出循环,等价于while(scanf("%d",&n)!=EOF)。
3.&&的含义
&&是AND的意思,逻辑运算符“与”,简单说A&&B就是A和B必须同时不为0 或者理解为A B都成立的情况。
综上所述,while(~scanf("%d", &n) && n)等价于while(scanf("%d",&n)==1 && n!=0 )要求输入成功,且n不是0才继续循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值