重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
正确的结果:对兑了17次,共换了93个瓶子,第18次对兑时余下1个空瓶,2个瓶盖。
创新互联专注于清流企业网站建设,自适应网站建设,商城网站建设。清流网站建设公司,为清流等地区提供建站服务。全流程定制制作,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
递归模型楼上“lzs丶灬 ”同志是正确的,但存在逻辑错误。我帮他修正如下:
public static int test(int sum, int pingzi, int gaizi){
if (pingzi 2 gaizi 3)
{
return sum;
}
int newPingzi = pingzi / 2;
int newGaizi = gaizi / 3;
sum += newPingzi;
sum += newGaizi;
pingzi = newPingzi + newGaizi + pingzi % 2;
gaizi = newGaizi + newPingzi + gaizi % 3;
return test(sum, pingzi, gaizi);
}
没具体做过,但我的想法是,首先先弄明白如何得到6升水。
1.将5升瓶子(A)装满水,倒进7升的瓶子(B) (现在B差2L水就满了)
2.重复1,只能倒进去2L,B就满了。B中的水倒掉,再把A中剩余的水倒进B(现在B差4L满)。
3.重复1,只能倒进去4L,B就满了。B中的水倒掉,再把A中剩余的水倒进B(现在B差6L满)。
4.重复1,现在能把全部的水(5L)倒进B中。加上3步骤B里的1L水,现在B里面就有6L水了。
那么,就可以利用栈(Stack)来进行操作。
A栈,长度为5;B栈,长度为7。
A、B栈中数据元素的类型皆为布尔类型。
初始化的时候,A中元素全为true,B中为false。
首先设定一个死循环。
然后在这个死循环中循环A栈,如果A中元素为true,则将B中对应位置的元素赋为true;
循环的时候,如果到A的末尾了,那么再从头开始循环A; 如果到B的末尾了,那么同样,也要从头开始对B赋值。
而当第二次循环到A中第二个元素的时候,B中对应的为最后一个元素(7),那么在循环到第三个元素之前,要将B中所有的元素设为false。下面同理,就是每当B栈满的时候,要将其设为空(就是所有元素设为false)。
然后,每次循环完A之后,检查一下B,如果B中有六个元素为true,而有一个为false,那么就得到了6L水。 然后break,跳出死循环,就OK了。
package 递归;
import java.util.Scanner;
public class 汽水 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入您购买汽水所花的钱");
int money=scan.nextInt();
System.out.println("20元一共能喝"+cal(money,money,money)+"瓶");
}
/**
*
* @param sum 总瓶数
* @param cap 瓶盖数
* @param bottle 瓶子数
* @return
*/
public static int cal(int sum,int cap,int bottle){
int add=cap/3+bottle/2;//每次循环所增加的汽水
sum=sum+add;
System.out.println(sum);
cap=cap%3+add;//每次循环后的瓶盖子
System.out.println(cap);
bottle=bottle%2+add;//每次循环后的瓶子
System.out.println(bottle);
System.out.println("-----------------");
if(cap3bottle2){//递归结束的条件
return sum;
}else{
return cal(sum,cap,bottle);//递归调用
}
}
}
20元一共能喝113瓶
public static int getbeer(int num)
{
int sum = num; //初始化总数
while(num=2) //瓶数大于等于2时,可以换
{
sum=sum+num/2; //新一次更换后总瓶数为更换前瓶数与瓶数/2的和
if(num%2==1) //这是为了保证不会因为奇数瓶摩2少掉一个空瓶
sum++;
num=num/2;
}
return sum; //这就是结果
}
你说的10瓶啤酒的问题,结果不会是15瓶,而是19瓶,因为可以继续换