在一行上输入一个整数
代表查询的月份。
在一行上输出一个整数,代表第
个月的兔子总数。
3
2
第一个月时,只有初始兔子(记为
),此时兔子总数为
。
第二个月时,依旧只有
,此时兔子总数为
。
第三个月时,
开始生兔子(记生出来的兔子为
),此时兔子总数为
。
第四个月时,
再生一只兔子,此时兔子总数为
。
第五个月时,
再生一只兔子,与此同时
也开始生兔子,此时兔子总数为
。
5
5
#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); } }
实际为斐波那契数列 #include<stdio.h> int main(){ int month; while(scanf("%d", &month) != EOF){ int chusheng[month],chengzhang[month],chengnian[month],num; chengnian[0] = 1; chengzhang[0] = 0; chusheng[0] = 0; if(month >= 2){ chengnian[1] = 1; chengzhang[1] = 0; chusheng[1] = 0; } for(int date = 2; date < month; date++){ chengnian[date] = chengnian[date-1] + chengzhang[date -1]; chengzhang[date] = chusheng[date -1]; chusheng[date] = chengnian[date]; } num = chusheng[month -1] + chengzhang[month -1] + chengnian[month -1]; printf("%d\n", num); } }