问题描述:有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
package Day32; import java.util.*; public class Test { public static int a; public static int b; public static int c; public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc =new Scanner(System.in); while(sc.hasNext()) { int n=sc.nextInt(); Test t=new Test(); System.out.println(t.fun(n)); } } public static int fun(int n) { if(n==1) { return 0; } else { b=n/3; c=n/3; while(b!=0) { a=n%3; c=c+((a+b)/3); n=(a+b); b=n/3; } a=n%3; if(b==0&&a==2) { c++; } } return c; } } package Day32; //牛人的数学总结:喝的饮料数总是空瓶数的一半,但并不是很适用所有情况,如果换成4个空瓶子换汽水呢 //另一中比较好的实现方法,采用递归 /* 递归问题 3个瓶子换1瓶水+1个空瓶子,两个瓶子换1瓶水+0个空瓶子,1个瓶子换0瓶水。 f(1) = 0 f(2) = 1 f(3) = 1 f(4) = f(2)+1 //4个瓶子,其中3个可以换1瓶水+1个空瓶,所以是f(2)+1 f(5) = f(3)+1 //3个瓶子换1瓶水+1个空瓶,所以是f(3)+1 ... f(n) = f(n-2)+1 */ import java.util.*; public class Test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc =new Scanner(System.in); int n= sc.nextInt(); System.out.println(f(n)); } public static int f(int n) { if(n==1) { return 0; } while(n>=2)//是跳出递归的主要条件,很重要 { return (f(n-2)+1); } return 0; } }