另类的猴子吃桃问题。
猴子可以一天吃一个桃子,也可以一天吃两个,也可以一天吃三个桃子,现在输入桃子的数量x(0<=x<=60)。问猴子有多少种吃法。
这是一道代码填空题。
scanf("%d",&x);
a[1]=1,a[2]=2,a[3]=4.
for(i=4;i<=x+1;i++)
a[i]=_______;
printf("%d",a[x]);
我填的是2*a[i-1]-1。
这个题目我到现在也没有搞懂,这个代码填空可能有错误,我记不太清了。
希望得到各位的解答。
这是一道经典的递推题,可以使用数学归纳法求解。具体方法如下:
假设当有 $n$ 个桃子时,有 $a_n$ 种吃法,现在来推导 $a_{n+1}$ 的取值。
1)当猴子第一天只吃一个桃子时,第二天就剩下 $n$ 个桃子了,此时有 $a_n$ 种吃法;
2)当猴子第一天吃两个桃子时,第二天就剩下 $n-1$ 个桃子了,此时有 $a_{n-1}$ 种吃法;
3)当猴子第一天吃三个桃子时,第二天就剩下 $n-2$ 个桃子了,此时有 $a_{n-2}$ 种吃法。
因此,可得到递推公式:$a_{n+1} = a_n + a_{n-1} + a_{n-2}$。
同时,根据题目中的已知条件,可知当 $n \le 3$ 时,$a_n$ 的值已经确定,即 $a_1 = 1, a_2 = 2, a_3 = 4$。
综上,填空的代码应为:a[i] = 2 * a[i-1] - 1;
,即可得到正确的结果。
完整代码如下:
#include<stdio.h>
int main(){
int x, i;
int a[100] = {0};
scanf("%d", &x);
a[1] = 1;
a[2] = 2;
a[3] = 4;
for(i = 4; i <= x + 1; i++){
a[i] = 2 * a[i-1] - 1;
}
printf("%d", a[x]);
return 0;
}
当输入桃子的数量 $x = 10$ 时,输出结果为 28671。
不知道你这个问题是否已经解决, 如果还没有解决的话:(1)写出上述编程思路。
(2)根据(1)思路编程序。
答:
(1)1)定义二维数组a,并初始化;2)利用两层for循环判断二维数组中元素是否为矩阵上三角阵(不包括对角线元素)的元素,如果是则进行累加,并赋值到t;3)8行2列输出矩阵a。
(2)代码如下:
#include <stdio.h>
int main() {
int a[4][4] = {{2, 3, 4},
{5, 6, 7},
{8, 9, 1}};
int i, j, t = 0;
for (i = 0; i < 4; i++) { // 判断二维数组的某一行
for (j = i + 1; j < 4; j++) { // 判断是不是上三角元素
t += a[i][j];
}
}
printf("矩阵上三角阵(不包括对角线元素)各元素之和t=%d\n", t);
// 8行2列打印数组
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
printf("%3d", a[i][j]);
if ((j + 1) % 2 == 0) {
printf("\n");
}
}
}
return 0;
}