问题描述:有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是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;
}
}