关于喝矿泉水的问题,我的思路应该没有错的啊,大家帮我看看
/*需求:矿泉水一元钱一瓶,每2个空瓶换一瓶矿泉水,现在又20元,请问可以喝多少瓶矿泉水?
*/
class Water
{
int sum=0;
boolean flag = true;
void water(int p)
{
int n = p;
while(flag) //一共能喝矿泉水瓶数
{
if (n<=0)
{
sum+=1;
flag = false;
}
sum += n;
n = p/2;
}
System.out.println(sum);
}
}
class WaterDemo3
{
public static void main(String[] args)
{
Water w = new Water();
w.water(20);
}
}
为什么运算时会变成死循环了?没有打印,一直停在那里。
如果不封装对象的话在main里是可以正常运行的
如果用for循环的话就无法把实参传到形参哪里,打印出结果是0.
----------------解决方案--------------------------------------------------------
好像没错啊
----------------解决方案--------------------------------------------------------
2个错误
第一,代码没有考虑单数问题。例如5个空瓶子,可以换2个矿泉水和余留1个空瓶。而代码中直接整除没有考虑上次/上上次遗留下来的1个空瓶子
第二,n = p/2; 而p永远不会再变了,所以n经过2次循环后也不会再改变,这是死循环的原因。
----------------解决方案--------------------------------------------------------
楼上正解
----------------解决方案--------------------------------------------------------
看看
----------------解决方案--------------------------------------------------------
money = 1, bottle = 1
money = 2, bottle =2 => money = money + 1
money = 3, bottle =3 => money = money + 1, bottle = 1
因为1块钱可以买一瓶水,空瓶可以换0.5元,其实每瓶水相当于0.5元就可以买
考虑到只有1块钱特殊情况,空瓶换的0.5元什么也看不了
drink = (int(money - 1)) * 2 + 1
----------------解决方案--------------------------------------------------------
首先你的n=p/2,而p是不变的,你的n也就永远不变所以就进入死循环了。再者,这里lz必须考虑到余数的问题。
如果按lz的思路,可以把程序改动下:
class Water{
int n,m,sum;
void water(int p){
n=p;
sum=p;
while(n>1){
sum+=n/2;
m=n%2;
n=n/2;
if(m!=0){
n=n+m;
}
}
System.out.println(sum);
}
}
----------------解决方案--------------------------------------------------------
public class Water {
public static void main(String[] args) {
int i, sum = 20;
for(i=10;i>=1;i=i/2){
sum=sum+i;
}
System.out.println(sum);
}
}
----------------解决方案--------------------------------------------------------
楼上的对得好别扭。。。
----------------解决方案--------------------------------------------------------