当前位置:编程学习 > C/C++ >>

C语言,猴子吃桃子代码求注释

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

# include <stdio.h>

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

    printf("剩余桃子有%d个,一共有%d个桃子。\n",s[5]*4,s[0]);


return 0;
}

答案:哥们好,我来解释解释哈
这个程序是倒着分析的:首先说的是s[n]为第n只猴子走后,留给其他每个猴子的桃子的数目。(当然猴子都不知道前面的猴子已经拿过了),所以剩余桃子是s[5]*4,就是第五只猴子给其他每只猴子留下的桃子数目乘以4。
倒着推,第五只猴子先多吃了一个,再平分5份,并吃掉了自己的一部分,那么留下的s[5]其实肯定是4的倍数【这段代码其实可以优化一下】则留下的s[5]*5并加上1,就是第4个猴子留下的桃子总数,然后看下是否是4的倍数,因为这是第四个猴子留下的准备给其他4个猴子的桃子,肯定是4的倍数啦,如果不是就说明错误咯,,然后这个数再除以4,再乘以5,再加上1,就是第三只猴子留下的桃子总数,那肯定也是4的倍数啦。
以此类推,就能推到第一只猴子时的桃子数什么的,总数什么的,都出来啦
如果上面意思弄懂了,现在就说程序本身,先假设s[5]为1,然后看s[5]*5+1【就是第四只猴子留下的桃子数目】是否能被4整除,如果不能,就直接跳出循环,假设s[5]为2,再看s[5]*5+1能否被4整除,如果能被整除,就得到s[4]的值,【就是你 “s[4] /= 4;  //想知道这代码有什么用”的这段代码的意思】再乘以5,然后再加上1,就是第三只猴子留下的桃子数目,再看这个能否被4整除,如果不能,就直接跳出循环,再重新来啦  一直到s[1],最后s[0]就是所谓的总数目啦, 懂了吧,朋友?还没懂的话 就再继续探讨探讨哈 欢迎

   if( (s[4]%4) !=0 )
         continue;
     else
         s[4] /= 4; 

是指当不到最后一次,也就是分成5份后还剩一个才能有继续分的必要。

s[4] /= 4; 是更新当前的桃子数目。

楼主,c我不懂,提供你c#源码:

            for (int i = 30; i < 100000; i++)
            {
                if (i % 5 == 1)
                {
                    int x2 = i-1 -(i-1)/5; //第二只猴子
                    if (x2 % 5 == 1)
                    {
                        int x3 = x2 - 1 - (x2 - 1) / 5; //三
                        if (x3 % 5 == 1)
                        {
                            int x4 = x3 - 1 - (x3 - 1) / 5; //四
                            if (x4 % 5 == 1)
                            {
                                int x5 = x4 - 1 - (x4 - 1) / 5;
                                if (x5 % 5 == 1)
                                {
                                    textBox1.AppendText(i.ToString() + ",");
                                }
 
                            }
                        }
                    }
                }
            }

上一个:C语言中的stdbool头文件为什么总打不开?
下一个:C语言高手麻烦给诊断一下答案是否正确

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,