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语言枚举问题 猴子分桃的主要内容,如果未能解决你的问题,请参考以下文章