C语言枚举问题 猴子分桃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言枚举问题 猴子分桃相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
int main(void)

int num,min,i,r,m;//num为猴子数,min为最小桃子总数,i用于分的次数,r即m,m为桃子可能的个数。
scanf("%d",&num); //猴子数
for(m=1;m<=100;m++)//桃子总数

r=m;
for(i=num;i>=1;i--)

if(m-1>0&&(m-1)%5==0&&(m-1)/5!=0)//判断桃子能否合题分配
m=(m-1)/5*4;
continue;

else r=-1;break;

if(r!=-1)

min=r;break;

else continue;

printf("min=%d\n",min);
printf("last=%d\n",m);


这个程序能运行,但输入后没反应,求解

死循环了!

if(m-1>0&&(m-1)%5==0&&(m-1)/5!=0)//判断桃子能否合题分配

这句里,之前 m=1,这里始终不能成立,if 不运行,然后就一直循环。。。。
参考技术A for(m=1;m<=100;m++)//桃子总数 m 是循环控制变量,不能让别人乱改之!!

r=m;
for(i=num;i>=1;i--)

if(m-1>0&&(m-1)%5==0&&(m-1)/5!=0)//判断桃子能否合题分配
m=(m-1)/5*4; //这里修改m会导致死循环的!! 有点不太明白这部分
continue;
参考技术B 代码和分析如下:
#包括中

INT N,K,T = 0;分配代表/ /吨数,n猴子,K桃子

布尔乐趣(整数M)



如果(M <= K)返回false; / /如果猴子的当前分配可能小于k桃子,返回false

如果(M%不适用!= K)返回false; / /如果当前的桃子%当n = k,返回false

T + +;! / /这个猴子可以被分配桃子

如果(T> = N)返回true; / /分配n次,以满足出口

的条件,如果(乐趣(MKM / N)!)返回false / /下一个猴可分为MKM / N只桃子

返回true; / /以上条件都满足,则返回true



国际主要()

的scanf(“%D”,&N,&K);

如果(N == 1)printf(“请为%d”,1 + K);返回0; / /如果有只有一个猴子,直接输出,退出

为(int i = 1;,我+ +)



T = 0,/ /每个周期各显神通

整数M = N * I + K; / /不要从一开始的周期令m直接。反正肯定%N = K表

如果(乐趣(M))



的printf(“%d个”,M);

突破;

BR />

返回0;



测得几组数据,如两只猴子桃子,是7。对于上面的程序时,才会有一只猴子的问题,但只会桃子到1 MK其余各等份它的意义也是这样吗?
如果是这样,那么,如果只有一个猴,就可以直接输出1 + K。

5个猴子分桃

猴子分桃

山洞里有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔到洞外,拿走了一份;
第二只猴子把剩下的桃子平均分成五份,又多了一个,它同样把多的一个扔到洞外,拿走了一份;
第三、第四、第五只猴子都是这样做的,问山洞里原来最少有多少个桃子?

/*猴子分桃。

问题描述:山洞里有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔到洞外,拿走了一份;
第二只猴子把剩下的桃子平均分成五份,又多了一个,它同样把多的一个扔到洞外,拿走了一份;
第三、第四、第五只猴子都是这样做的,问山洞里原来最少有多少个桃子?


分析题目:
      假设现在我为其中的任意一只猴。面对眼前的桃子,我扔掉一只,发现剩下的够我们兄弟5个平均分的。拿走属于我的一份.
      如果理解到这里.基本上也就知道怎么写算法了.只要能求出每一个猴子当前桃子总数,最后就能求出最终结果.
      还有一个问题就是从什么地方入手,是知道第一只猴子面前的总数还是最后一只猴子面前的总数.

再次假设:
     1:知道第一只猴子面前的总数n.那么下一只猴子面前应该有(n-1 - (n - 1)/5)个桃子.可以利用一个循环来实现n的值是否满足要求.这是算法1.
     2:如果知道最后一只猴子面前的总数n(包括多出来的那一个),那么上一只猴子面前应该有n/4 * 5 + 1个桃子.同样,也可以利用一个循环来验证满足条件的n值.这是算法2.

算法2:      
        temp为第n个猴子拿走自己的一份前看到的桃子数(扔掉一个以后的),temp1为第n-1个猴子拿走自己的一份前看到的桃子数
        temp和temp1的关系: temp1-1/5*temp1=temp+1   即temp1=(temp+1)*5/4    
        temp1和temp是第n个猴子与第n-1个猴子在取走自己的那一份之前的桃子个数,建立前后递推公式
*/
#include<iostream>
using namespace std;
int main()
{
    int Count = 5;  //Count为第5个猴子拿走自己的一份前,总共的桃子数,最少为5,即第5个猴子拿走1个
    //循环从count=6开始,依次递增,来判断是否合理
    while (true) 
    {
        int i = 1;  //i来记录猴子数
        int Temp = Count;   //temp从count数开始,第5个猴子拿走自己那一部分前的桃子总数
        //temp为第n个猴子拿走自己的一份前看到的桃子数,temp1为第n-1个猴子拿走自己的一份前看到的桃子数
        //temp和temp1的关系: temp1-1/5*temp1=temp+1   即temp1=(temp+1)*5/4    
        //temp1和temp是第n个猴子与第n-1个猴子在取走自己的那一份之前的桃子个数
        while ((Temp % 5 == 0) && ((Temp + 1) % 4 == 0)) //拿走前的桃子个数是5的倍数并且(temp+1)整除4,是为了前一个猴子的满足关系 Temp = (Temp + 1) / 4 * 5;
        {
            i++;  //增加猴子数,往前判断
            Temp = (Temp + 1) / 4 * 5; //前一个猴子拿走自己那一份前所看到的桃子个数
            if (i == 5)   
            {
                Count = Temp + 1;  //计算到第一个猴子了,总数等于第一个猴子拿走之前的总数再加1(扔掉的那个)
                break;
            }
        }

        if (i == 5)  
        {
            break;  //计算到第一个猴子了,结束循环,跳出(表示对所有5只猴子的桃子数的判断都合理,满足题目要求)
        }

        Count++;  //Count增1,进入下一此循环
    }
    cout<<"山洞里原来最少的桃子个数:"<<Count<<endl;
    return 0;
}

山洞里原来最少的桃子个数:3121

以上是关于C语言枚举问题 猴子分桃的主要内容,如果未能解决你的问题,请参考以下文章

5个猴子分桃

猴子分桃问题

C语言猴子吃桃问题递归法

C语言 用递归算法来解决猴子吃桃问题。:一天一只猴子摘下一堆桃子,吃了一半,觉得不过瘾,又多吃了一

C语言递归问题 猴子吃桃

猴子分桃—Python