package day2;
public class FenJinTiao {
/**
* @param args
* 题目:有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?
* 解决方案是这样的:只要我们将金条分成1/7、2/7,另一块4/7即可。
* 这样的话,,第一天给tom七分之一的金条,第二天让tom归还七分之一的金条然后给tom七分之二的金条,
* 第三天给tom七分之一的金条,第四天让tom归还所有的金条然后给他七分之四的金条,由此类推就可以满足要求了。
*
* 本题是上面故事的加强版:假设现在每天分给tom的金条为m,但是只能将金条分成n份,请问能满足要求吗?
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//调用分金块函数
int m=15;//m为分母,即表示m分之一
int n=4;
boolean flag=divide(m, n);
if(flag){
System.out.println("能满足要求。");
//打印每段的大小
for(int x=0;x<n;x++){
System.out.println((int)Math.pow(2, x)+"/"+((int)Math.pow(2, n)-1));
}
}
else
System.out.println("不能满足要求。");
}
/**
* 思路:
* 1、由题1/7、2/7、4/7可将金块长度设为7,每天给tom一块,方便处理,m同样;
* 2、分情况讨论:m和n为负数时报错,最大范围暂时只考虑int范围内;
* 3、考虑n满足的临界点,因为每天给的分量一样,所以有
* f(1)=1=Math.pow(2, 1-1)、1段
* f(2)=2=Math.pow(2, 2-1)、2段
* f(3)=f(2)+f(1)、
* f(4)=f(3)+f(1)=f(2)+2f(1)=4=Math.pow(2, 3-1)、3段
* f(5)=f(4)+f(1)、
* f(6)=f(5)+f(1)=f(4)+f(2)、
* f(7)=f(6)+f(1)=f(4)+f(2)+f(1)、
* f(8)=f(7)+f(1)=f(4)+f(2)+2f(1)=8=Math.pow(2, 4-1)、4段
* … … … …
* f(m)=f(m-1)+f(1)=Math.pow(2, n) n段
* 可以得出结论:m=Math.pow(2, n)为临界点,分n段最少要给m-1即Math.pow(2, n)-1
* 4、n大于临界点的永远满足。
*
* @return
*/
//分金条的方法:需要外部未知元素m、n参与,返回是否满足要求
public static boolean divide(int m,int n){
boolean flag=false;
if(m<=0||n<0){
System.out.println("不可能给tom非正数块金条,或者不可能将金条分成负数份");
return flag;
}
//int p=0;
//如果传入的p是几分之几,需要将金条长度置为整数以方便处理
//while(m*p!=1){p++;}
//根据临界点进行判断,m不大于n段能表示的数拾能满足要求,否则不满足
if(m<=Math.pow(2, n)-1)
flag=true;
return flag;
}
}
|