package know;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class T12 {
public static void main(String[] args) {
System.out.println(cal("9"));
}
public static BigDecimal cal(String xstr) {
BigDecimal x = new BigDecimal(xstr);
BigDecimal result = BigDecimal.ONE;
int end = calend(x);
System.out.println(end);
for (int i = 1; i <= end; i++) {
result = result.add(x.pow(i).divide(calmot(i), 5,
RoundingMode.HALF_UP));
}
return result;
}
/**
* 计算n的最大值 计算到小数点后5位
*
* @return
*/
public static int calend(BigDecimal x) {
int m = 1;
while (x.pow(m).divide(calmot(m), 6, RoundingMode.HALF_UP)
.compareTo(new BigDecimal("0.00001")) >= 0) {
m++;
}
return m;
}
/**
* 计算分母 m!
*
* @return
*/
public static BigDecimal calmot(int m) {
BigDecimal mot = new BigDecimal(m);
for (int i = m - 1; i > 0; i--) {
mot = mot.multiply(new BigDecimal(i));
}
return mot;
}
}
x的n次方/n!,肯定是n越大值越小的,题目要求精度计算到小数点后五位,那么当x的n次方/n!的值小于0.00001时,后面的值没必要计算了,根据这个就能得出n的最大值,其他的逻辑就很好实现了
0.2-1.0步长0.2,意思就是x取值0.2,0.4,0.6,0.8,1.0