一、统计每个月兔子的总数
题目
牛客网链接
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么第5个月开始每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
分析
原本的兔子( arr[n-1] )加上生的兔子( arr[n-2] )
代码实现
非递归(推荐,效率高)
#include <stdio.h>
int main()
{
int n = 0,ret=0,i=0;
int arr[100];
arr[0] = 1;
arr[1] = 1;
while (~scanf("%d", &n))
{
if (n <= 2)
ret = 1;
else
{
for (i = 2; i < n; i++)
arr[i] = arr[i - 1] + arr[i - 2];
ret = arr[n - 1];
}
printf("%d", ret);
}
return 0;
}
递归
#include<stdio.h>
int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
printf("%d\n", Fib(n));
}
}
二、青蛙跳台
题目
青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
分析
跳上n阶台阶有两种情况(青蛙跳一级和跳两级)
跳一级的次数( arr[n-1] )加上 跳两级的次数( arr[n-2] )
代码实现(只要将前两项改一下就好)
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int fib1 = 1;
int fib2 = 2;
if (n < 3)
printf("%d", n);
else
{
while (n > 2)
{
int tmp = fib2;
fib2 = fib1 + fib2;
fib1 = tmp;
n--;
}
printf("%d", fib2);
}
return 0;
}