86 母牛的数量
86 母牛的数量
作者:
问题描述 :
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?说明:假设在第n年及之前所有牛都不曾死亡。
输入说明 :
首先输入一个T,表示以下包含T行输入数据(测试实例),每行包括一个整数n(0<n<55),n的含义如题目中描述。
输出说明 :
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行,行首与行尾均无空格,最后无空行。
输入范例 :
3
1
30
53
输出范例 ::
1
85626
563332848
解题思路:这道题目其实有很强的规律性。先推算出前几项容易的,可以画出以下表格
然后我们可以发现一个规律,即now[i] = now[i-1] + now[i-3];i>=4。
根据这个规律我们可以写出两种风格的代码(提倡第二种写法)
一种是递归性质的如下:(这种有点滥用动态规划了,其实可以提前填好数组答案,推荐方法二)
方法一:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h> 5 #include <ctype.h> 6 7 8 9 10 __int64 resultNum(__int64 n); 11 12 __int64 record[60]; 13 14 int main(){ 15 16 17 18 int t,i,j,n; 19 scanf("%d",&t); 20 for(i=0;i<60;i++){ 21 if(i>=1&&i<=4){ 22 record[i]=i; 23 }else{ 24 record[i]=-1; 25 } 26 } 27 while(t--){ 28 scanf("%d",&n); 29 __int64 res = resultNum(n); 30 printf("%ld\n",res); 31 } 32 return 0; 33 } 34 35 36 __int64 resultNum(__int64 n){ 37 if(record[n]!=-1){ 38 return record[n]; 39 } 40 record[n] = resultNum(n-3)+resultNum(n-1); 41 return record[n]; 42 }
方法二:根据明显的递推关系now[i] = now[i-1] + now[i-3];i>=4。直接填好答案进入数组。代码如下:
简洁且简单,推荐方法二。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h> 5 #include <ctype.h> 6 7 8 9 __int64 now[60]={0,1,2,3}; 10 11 void answer(); 12 13 14 int main(){ 15 16 int t,n,i; 17 18 answer(); 19 20 scanf("%d",&t); 21 while(t--){ 22 scanf("%d",&n); 23 printf("%ld\n",now[n]); 24 } 25 26 return 0; 27 } 28 29 void answer(){ 30 31 int i; 32 for(i=4;i<=56;i++){ 33 now[i] = now[i-1] + now[i-3]; 34 } 35 36 }