C语言——另类的猴子吃桃问题

另类的猴子吃桃问题。
猴子可以一天吃一个桃子,也可以一天吃两个,也可以一天吃三个桃子,现在输入桃子的数量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。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: C语言-思路与编程1中的 6、定义一个矩阵a,计算矩阵上三角阵(不包括对角线元素)各元素之和,并8行2列输出矩阵 a。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    (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;
    }

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^