黑马程序员技术交流社区
标题: 一个猴子分桃的问题,看我的JAVA代码错在哪里?!! [打印本页]
作者: XiaoS 时间: 2013-12-30 16:47
标题: 一个猴子分桃的问题,看我的JAVA代码错在哪里?!!
本帖最后由 XiaoS 于 2014-1-1 13:56 编辑
题目:五只猴子采得一堆桃,它们约定次日早起来分。半夜里,一只猴子偷偷起来,把桃均分成五堆后,发现还多一个,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃了这个桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。问桃子总数最少有多少个?我的代码运行后没有反应?求高手解释!
class DD {
public static void main(String[] args) {
//定义一个变量sum,来记录桃子的总数(假定桃子数量在10000以内);
for (int sum = 0;sum <= 10000 ;sum++ ) {
if ((sum - 1) % 5 == 0) {
sum = (sum - 1) / 5*4;
if ((sum - 1) % 5 == 0) {
sum = (sum - 1) / 5*4;
if ((sum - 1) % 5 == 0) {
sum = (sum - 1) / 5*4;
if ((sum - 1) % 5 == 0) {
sum = (sum - 1) / 5*4;
if ((sum - 1) % 5 == 0) {
sum = (sum - 1) / 5*4;
System.out.println("sum = "+sum);
}
}
}
}
}
}
}
}
作者: 董月峰 时间: 2013-12-30 16:57
if ((sum - 1) % 5 == 0) {
//"%"【取余】改成“/”【除以】
作者: 董月峰 时间: 2013-12-30 17:11
/*五只猴子采得一堆桃,它们约定次日早起来分。
半夜里,一只猴子偷偷起来,把桃均分成五堆后,发现还多一个
,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,
还是多了一个,它也吃了这个桃子,拿走了其中一堆。
第三只,第四只,第五只猴子都依次如此做了。问桃子总数最少有多少个?
*/
//求最少sum,也就是第五只猴子起来后分成五堆,还多一个。有6个桃子留给第五个猴子
public class houzi {
public static void main(String[] args)
{
int sum=6;
for(int i=1;i<5;i++)
{
sum=5*sum+1;
}
System.out.print("桃子至少有:"+sum);
}
}
作者: XiaoS 时间: 2013-12-30 17:48
按照你的程序,输出结果是3906,第一只猴子分完剩下(3906-1)/5*4=3124个桃子,这就就不能给第二只猴子分了。
作者: XiaoS 时间: 2013-12-30 17:52
我想用sum-1后的数判断能否被5整除,所以用了%
作者: 布鲁Go 时间: 2013-12-30 18:49
本帖最后由 布鲁Go 于 2013-12-30 18:55 编辑
我去,花了我快两个小时,终于搞定了。。(中间都快崩溃了,编程真是个需要注意很小细节的脑力活,一旦思维陷进错误方向就痛苦)。。言归正传,你这个关键在于你没有搞临时变量,符合第一个判断后,循环就不是+1的递增了,而是直接从赋值后继续循环。 恩,还有这样写代码有点不够简洁,应该可以用递归简洁一点,脑袋有点晕就不优化了,你可以试试下面的代码。
- class DD {
- public static void main(String[] args) {
- //定义一个变量sum,来记录桃子的总数(假定桃子数量在10000以内);
- int temp;//要定义一个临时变量赋值。
- for (int sum = 0;sum <= 10000 ;sum++ ) {
- temp=sum;//这一步是关键,就是你sum改变后,不能自己赋值给循环里的sum.而要把sum赋值给临时变量才行,否则循环就不是从零开始了
- if ((temp - 1) % 5 == 0) {
- temp= (temp - 1) / 5*4;
- if ((temp - 1) % 5 == 0) {
- temp= (temp - 1) / 5*4;
- if ((temp - 1) % 5 == 0) {
- temp= (temp - 1) / 5*4;
- if ((temp - 1) % 5 == 0) {
- temp= (temp - 1) / 5*4;
- if ((temp - 1) % 5 == 0) {
- temp= (temp - 1) / 5*4;
- System.out.println("sum = "+sum);//注意,你原来的方式,就算合理的0-1000循环,打印出来的也不是需要的sum,而是分到最后的桃子数。
- }
- }
- }
- }
- }
- }
- }
- }
复制代码
作者: daoyua 时间: 2013-12-30 20:37
我知道你那个怎么回事了,你陷入死循环了,当SUM=0的时候第一个IF退出,但当SUN=1的时候, if ((sum - 1) % 5 == 0)这个成立但是sum = (sum - 1) / 5*4;这个SUM又变成0了,然后下SUM有++又变成1,如此无限循环了
作者: daoyua 时间: 2013-12-30 20:41
找出你的错误了吧,求结束给分,你可以修改方法的,楼上那位修改了你的那个临时变量问题
作者: 董月峰 时间: 2013-12-30 22:11
public class houzi2 {
public static void main(String[] args)
{
for(int x=1;x<999;x++)
{
double sum=5*x+1;
/*
第五个猴子拿走了x+1,剩下4x个,算作第四个猴子拿剩下的第五个猴子醒来看到的所有桃子数量sum就是5x+1
那么第四个猴子醒来看到多少呢?依次类推,第一个醒来看到的是多少呢?
*/
for(int i=4;i>=1;i--)
{
sum=sum/4*5+1;
}
if(sum==(int)(sum))
System.out.println(sum);
}
}
}
//个人疑惑,怎样找出最小的就立即结束循环,break;貌似结束的不对
作者: XiaoS 时间: 2014-1-1 13:49
谢谢啦,结果没问题!!:D
作者: XiaoS 时间: 2014-1-1 13:51
找到问题了,,谢谢!:lol
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |