鱼C论坛

 找回密码
 立即注册
查看: 923|回复: 13

[已解决]【初学者求教】猴子吃桃问题

[复制链接]
发表于 2020-8-20 09:03:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大侠,小弟初学者,自学课本时有这么一个题:
猴子第一天摘下若干个桃子,当即吃了一半,不过瘾就多吃了一个。第二天又将剩下的桃子吃了一半,不过瘾多吃了一个。
以后每天都吃前一天剩下的一半再加一个。到第10天只剩下一个。问猴子第一天摘了多少个桃子?

我看给出的代码如下:

#include <stdio.h>
main ()
{
    int i,x1,x2;           //定义x1为总数,x2为第二天剩的
    i=9,x2=1;
    while (i>0)
    {
        x1=(x2+1)*2;
        x2=x1;
        i--;   
    }
    printf ("总共有 %d 个桃子\n",x1);
}

我想知道x2=x1;这一句起什么作用呢?
谢谢!
最佳答案
2020-8-20 15:47:57
你提供的代码就是利用倒推的方式,所以他是从第10天推算到第1天有多少个,第10天1个,那么第9天吃剩下的就是1个,然后用吃剩下的加1个再乘2(代码行:x1=(x2+1)*2),就是第9天的总数,也就是第8天的吃剩下的(代码行:x2=x1),以此类推
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-20 09:07:10 | 显示全部楼层
更新第二天剩下的桃子数量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 09:26:48 | 显示全部楼层
呵呵,我昨晚才做了这个题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 09:29:27 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-8-20 09:30 编辑

// 猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
// 第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了
// 前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。
// 求第1天共摘多少个桃子。


  1. #if(0)
  2. #include <stdio.h>

  3. int main()

  4. {
  5.         int sum = 0;
  6.         int day_eat(int x);
  7.         sum = day_eat(10);
  8.         printf("总桃子数为:%d 个\n",sum);
  9.         printf("\n");

  10. }

  11. int day_eat(int x)

  12. {
  13.         int i,temp = 1;
  14.         for (i = 1;i <x;i++)
  15.         {
  16.                 temp = 2 * (temp + 1);        // 最后一天只剩下 temp = 1 个,则前一天应该是 2 * (temp + 1) 个
  17.                                               // 吃掉一半,剩下 temp + 1 个,再多吃一个,剩下 temp 个
  18.         }
  19.         return temp;

  20. }

  21. #endif


  22. // 用递归法
  23. #if(1)

  24. #include <stdio.h>
  25. int day_eat(int n);

  26. void main()

  27. {
  28.         int n = 10;                                      /*定义变量天数*/
  29.         int sum;                                         /*定义变量桃子总数*/
  30.         sum = day_eat(10);
  31.         printf("总桃子数为:%ld 个\n",sum);
  32.         printf("\n");
  33. }

  34. int day_eat(int n)
  35. {
  36.         int temp;                                        /*定义函数返回值即桃子总数*/
  37.         if(n == 1)                                       /*如果是最后一天时*/
  38.         {
  39.         temp = 1;                                        /*桃子在最后一天剩下数*/
  40.         }
  41.         else
  42.         {
  43.         temp = 2 * (day_eat(n - 1) + 1);                 /*前一天的桃子数目等于后一天数量加1乘2*/
  44.         }
  45.         return temp;
  46. }

  47. #endif

复制代码


这里有两个程序,你喜欢哪个就用哪个吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 15:47:57 | 显示全部楼层    本楼为最佳答案   
你提供的代码就是利用倒推的方式,所以他是从第10天推算到第1天有多少个,第10天1个,那么第9天吃剩下的就是1个,然后用吃剩下的加1个再乘2(代码行:x1=(x2+1)*2),就是第9天的总数,也就是第8天的吃剩下的(代码行:x2=x1),以此类推
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 20:42:53 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-20 20:46 编辑

不知道答案对不对?
  1. #include <stdio.h>

  2. #define count(x) (x*2+1)

  3. int main(void)
  4. {
  5.         int x = 1;
  6.         int day = 10;
  7.         while (day--) x = count(x);
  8.         printf("%d\n",x); //x = 2047
  9.         return 0;
  10. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 23:00:15 | 显示全部楼层
不行就递归暴力模拟,干就完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 01:43:40 | 显示全部楼层
Cool_Breeze 发表于 2020-8-20 20:42
不知道答案对不对?

你这个肯定是不对的,理由:桃子总数若为 2047个,第一天吃掉一半加一个,剩下1023个,第二天吃掉一半加一个,剩下511个,第三天吃掉一半加一个,剩下255个,第四天吃掉一半加一个,剩下127个,第五天吃掉一半加一个,剩下63个,第六天吃掉一半加一个,剩下31个,第七天吃掉一半加一个,剩下15个,第八天吃掉一半加一个,剩下7个,第九天吃掉一半加一个,剩下3个(这也就是第十天的桃子数),而题目要求是第十天只剩下一个桃子。

1534-->766-->382-->190-->94-->46-->22-->10-->4-->1 。所以,桃子数为 1534 个才是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 08:20:22 | 显示全部楼层
风过无痕1989 发表于 2020-8-21 01:43
你这个肯定是不对的,理由:桃子总数若为 2047个,第一天吃掉一半加一个,剩下1023个,第二天吃掉一半加 ...

那就这样!
  1. #include <stdio.h>

  2. #define count(x) (x*2+2)
  3. int main(void)
  4. {
  5.         int x = 1;
  6.         int day = 9;
  7.         while (day--) x = count(x);
  8.         printf("%d\n",x); //x = 1534
  9.         return 0;
  10. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 09:02:04 | 显示全部楼层
非常感谢各位大侠的指导,受教了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 16:07:50 | 显示全部楼层

你 while 语句用得比较溜,我比较喜欢用 for , 现在还落下一毛病,有点喜欢用子函数来解决主函数沉长的问题了。所以你编写出来的程序比较短小精悍,你的程序我也收纳了,作为第三种方法,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 16:25:40 | 显示全部楼层
风过无痕1989 发表于 2020-8-21 16:07
你 while 语句用得比较溜,我比较喜欢用 for , 现在还落下一毛病,有点喜欢用子函数来解决主函数沉长的问 ...

可以不用函数
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int x = 1;
  5.         int day = 9;
  6.         while (day--) x = x*2+2;
  7.         printf("%d\n",x); //x = 1534
  8.         return 0;
  9. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 16:29:42 | 显示全部楼层

不记得是哪位前辈说过的了,主函数最好不超过一屏,从那时起,我能从主函数里拆分出来的,一般都用子函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 16:48:33 From FishC Mobile | 显示全部楼层
这个东西,没有要求的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表