猴子摘桃问题c语言。

五只猴子一起摘了一堆桃子,因为太累了,它们商量决定,先睡一觉再分.一会其中的一只猴子来了,它见别的猴子没来,便将这堆桃子平均分成5份,结果多了一个,就将多的这个吃了,并拿走其中的一份.一会儿,第2只猴子来了,他不知道已经有一个同伴来过,还以为自己是第一个到的呢,于是将地上的桃子堆起来,再一次平均分成5份,发现也多了一个,同样吃了这1个,并拿走其中一份.接着来的第3,第4,第5只猴子都是这样做的.......,根据上面的条件,问这5只猴子至少摘了多少个桃子?第5只猴子走后还剩下多少个桃子?

#include<stdio.h>
int main() {
    int t;//t为最后剩下的桃子数
    for(t = 4;; t = t + 4) { //最后剩下的桃子数一定为4的倍数
        int s;
        s = t;
        int i;//i为循环变量
        for(i = 1; i <= 4; i++) {
            int s1;//s和s1用于计算第五只到第二只猴子看到的桃子数
            s1 = s * 5 / 4 + 1;
            if(s1 % 4 != 0)break; //第五只到第二只猴子看到的桃子数一定为4的倍数
            s = s1;
        }
        if(i > 4) {
            printf("%d %d", s * 5 / 4 + 1, t);    //第一只猴子看到的桃子数不需要是4的倍数。t为剩下的桃子数,s为第二只猴子看到的桃子数,那么s*5/4+1为第一只猴子看到的桃子数。
            break;
        }
    }
    return 0;
}

#include <iostream>
using namespace std;

int main(void)

{
 int s[6]={0};
 int i;
 for (s[5]=1;;s[5]++)
 {
  s[4]=5*s[5]+1;  //可以肯定的是 第一次的桃子桃 x%5==1  

   if( (s[4]%4) !=0 )
      continue;
     else
            s[4] /= 4;  //想知道这代码有什么用
      s[3]=5*s[4]+1;
           if( (s[3]%4) !=0 )
      continue;
     else
            s[3] /= 4;
      s[2]=5*s[3]+1;
           if( (s[2]%4) !=0 )
      continue;
     else
            s[2] /= 4;
      s[1]=5*s[2]+1;
              if( (s[1]%4) !=0 )
      continue;
     else
            s[1] /= 4;
      s[0]=5*s[1]+1;

    break;
}

    cout<<"剩余桃子有"<< s[5]*4 << "个" << ",一共有" << s[0] << "个桃子." << endl;


return 0;
} 

运行结果:

img

是没有编程思路,还是,有了编程思路,不会写代码啊?

编程思路:

  1. 计算机是机器,它的优势就是可以快速的进行重复的计算;
  2. 既然使用数据的解题思路很复杂,那么,你可以尝试抛弃数学方式的解题思路;
  3. 这道题的问题是想知道最后剩余几个桃子,剩余的数据量肯定是5的倍数,否则,第5只猴子,无法平分成5份。
  4. 假设最后剩余的桃子数是x个,那么,第4只猴子剩下的桃子数量是 x/4*5+1,其中x是4的整数倍;
  5. 将5只猴子的分桃过程,逆向的重演一遍,如果能够还原最初的场景,那么,就可以求得最终的结果了。

逆向过程

  1. 第5只猴子,剩下 x
  2. 第4只猴子,剩下 x*5/4+1 ,其中 x是4的倍数
  3. 第3只猴子,剩下 (x*5/4+1)5/4+1,其中(x5/4+1)是4的倍数
  4. 第2只猴子,剩下 ((x*5/4+1)*5/4+1)5/4+1,其中((x5/4+1)*5/4+1)是4的倍数
  5. 第1只猴子,剩下 (((x*5/4+1)*5/4+1))*5/4+1)5/4+1,其中(((x5/4+1)*5/4+1))*5/4+1)是4的倍数

构建编程思路

  1. 很明显,上述过程,可以采用循环结构来处理;
  2. 每一个步骤处理的数据,都和上一步的处理结果,保持一种数学的计算关系;
  3. 每一个步骤,都会有一个验证条件,如果条件满足就可以进入下一步;
  4. 如果条件不满足时,可以退出循环,说明验证失败
  5. 尝试将x从4到10000,(4,8,12,16 ... 10000)逐个进行验证,找到满足5只猴子分桃,每次都满足验证条件的结果。
  6. 于是,出现了两层循环,外层递增x,增量是4;内层验证5只猴子分桃,数量满足倍数条件。