在一行上输入一个整数
代表查询的月份。
在一行上输出一个整数,代表第
个月的兔子总数。
3
2
第一个月时,只有初始兔子(记为
),此时兔子总数为
。
第二个月时,依旧只有
,此时兔子总数为
。
第三个月时,
开始生兔子(记生出来的兔子为
),此时兔子总数为
。
第四个月时,
再生一只兔子,此时兔子总数为
。
第五个月时,
再生一只兔子,与此同时
也开始生兔子,此时兔子总数为
。
5
5
#include <math.h>
#include <stdio.h>
int main() {
//根据画图,这是一个斐波那契数列,利用动态规划从底部网上算完事
int d1=1; //第一个月的兔子
int d2=1;
int dangqian=2;//当前月份兔子的数量
//int i=3;
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++)
{
if (n==1||n==2) {
printf("1");//输出结果
break;
}
dangqian=d1+d2;
if (i==n) {
printf("%d",dangqian);//输出结果
}else {
d1=d2;
d2=dangqian; //往前推便于后面的计算
}
}
return 0;
} #include <stdio.h>
int num(int a) {
if (a == 1 || a == 2)return 1;
else return (num(a - 1) + num(a - 2));
}
int main() {
int n;
scanf("%d", &n);
printf("%d", num(n));
return 0;
} 经典斐波那契数列,我用的是递归法,也可以用递推法。
#include <stdio.h>
//出生后第三个月即就是出生两个月后,有几个会生崽就有几个会出生
int main() {
int n = 0;
int m[31] = {0}; //第n个月会生崽的兔子数量
int num = 1; //兔子总数
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
if (i < 3) {
m[i] = 0;
} else if (i == 3) {
m[i] = 1;
} else {
m[i] = m[i - 1] + m[i - 2];//第n个月会生崽的兔子数量等于第n-1个月会生崽的兔子数量加上第n-2个月的
}
num += m[i];//第n个月兔子的总数等于第n-1个月兔子的总数加上第n个月会生崽的兔子的数量
}
printf("%d",num);
return 0;
} #include <stdio.h>
int main()
{
int n;
while(~scanf("%d", &n)) {
int num1 = 1, num2 = 1, ret = 0;
for (int i = 2; i < n; i++) {
ret = num1 + num2;
num1 = num2;
num2 = ret;
}
printf("%d\n", ret);
}
return 0;
} 这其实是一个斐波那契数列。第 n 个月的兔子数量实际上就是第 n-1 个斐波那契数。 用循环实现可以避免过度递归 #include <stdio.h>
int main() {
int n;
scanf("%d",&n);
int a=1;
int b=1;
int c=1;
while(n)
{
a=b;
b=c;
c=a+b;
n--;
}
printf("%d",a);
return 0;
} #include <stdio.h>
int main()
{
int new_habbit = 0;
int one_habbit = 0;
int old_habbit = 1;
int month = 0;
scanf("%d",&month);
if(month < 3)
{
printf("%d",1);
return 1;
}
int k = 3;
while(k <= month)
{
old_habbit += one_habbit;
one_habbit = new_habbit;
new_habbit = old_habbit;
k++;
}
printf("%d",new_habbit+one_habbit+old_habbit);
return 0;
} #include <stdio.h>
int main()
{
int mon[3] = {1};
char month, i;
scanf("%d", &month);
for(i = 1; i < month; i++)
{
mon[2] += mon[1]; // 能生育兔子
mon[1] = mon[0]; // 发育中的兔子
mon[0] = mon[2]; // 新生的兔子
}
printf("%d", mon[0] + mon[1] + mon[2]);
} #include <stdio.h>
int fib(int n){
if(n<3){
return 1;
}
else{
return fib(n-1)+fib(n-2);
}
}
int main(){
int n;
scanf("%d",&n);
printf("%d",fib(n));
} #include <stdio.h>
int a[32];
int rb(int n){
if(n<3){
return 1;
}
else{
if(a[n]==0){
a[n]=rb(n-1)+rb(n-2);
}
return a[n];
}
}
int main(){
int n;
scanf("%d",&n);
printf("%d",rb(n));
} #include <stdio.h>
int rb(int n){
if(n<3){
return 1;
}
int dp[n+1];
dp[1]=dp[2]=1;
for(int i=3;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
int main(){
int n;
scanf("%d",&n);
printf("%d",rb(n));
} #include <stdio.h>
int rb(int n){
if(n<3){
return 1;
}
int a,b,c;a=b=1;
for(int i=3;i<n+1;i++){
c=a+b;a=b;b=c;
}
return c;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",rb(n));
} #include<stdio.h>
int count(int n)
{
if(n==1||n==2)
return 1;
else
return count(n-1)+count(n-2);
}
int main()
{
int num,res;
while(scanf("%d",&num)!=EOF)
{
res = count(num);
printf("%d\n",res);
}
}