1.猴子吃桃问题
问题描述:孙悟空第一天摘下若干蟠桃,当即吃了一半,感觉不过瘾,又多吃了一个。第二天他将剩下的桃子又吃了一般,还不过瘾,又多吃了一个。之后每天他都吃掉前一天剩下的桃子的一半零一个。到第十天再想吃时,就剩下一个桃子了,求孙悟空第一天共摘了多少个蟠桃?
算法实现:
import org.junit.Test;
public class MonkeyEatFruit {
//递推实现
int eat01(int n){
int a = 1;
for(int i=2;i <= n;i++){
a = a*2 + 2;
}
return a;
}
//递归实现
public int eat02(int n){
if(n == 1){
return 1;
}else{
return eat02(n-1)*2 + 2;
}
}
@Test
public void eat01Test(){
int i = eat01(10);
System.out.print(i);
}
@Test
public void eat02Test(){
int i = eat02(10);
System.out.print(i);
}
}
2.最大公约数和最小公倍数
最大公约数采用辗转相除法,又称欧几里得算法:
令较大数为m,较小数为n;
当m除以n的余数不等于0时,把n作为m,并把余数作为n,进行下一次循环;
当余数等于0时,返回n。
最小公倍数 = m*n/m,n的最大公约数
import org.junit.Test;
public class GcdAndLcm {
public int gcdDemo1(int m,int n){
int a;
int x = Math.max(m, n);
int y = Math.min(m, n);
m=x;
n=y;
for(;;){
//如果m/n 余数不为零
if(x%y != 0){
a = x%y;
x = y;
y = a;
}else{
//如果m/n 余数为零 返回n
break;
}
}
return y;
}
public int gcd02(int m,int n){
int x = Math.max(m,n);
int y = Math.min(m,n);
if(x%y == 0){
return y;
}else{
return gcd02(y,x%y);
}
}
public int lcm(int m,int n){
return m*n/gcd02(m,n);
}
@Test
public void demoTest(){
int num = gcdDemo1(60,24);
System.out.print(num);
}
@Test
public void demo2Test(){
int num = gcd02(60,24);
System.out.print(num);
}
@Test
public void lcmTest(){
int num = lcm(60,24);
System.out.print(num);
}
}