
Java计算 1+1/2!+1/3!·····1/20! 谁能给我详细讲解一下以下代码这个阶乘是在哪算的
importjava.math.BigDecimal;publicclassCases027{publicstaticvoidmain(String[]args){Big...
import java.math.BigDecimal;
public class Cases027 {
public static void main(String[] args){
BigDecimal sum = new BigDecimal(0.0); //和
BigDecimal factorial = new BigDecimal(1.0); //阶乘项的计算结果
int i = 1; //循环增量
while(i<=20){
sum = sum.add(factorial); //累加各项阶乘的和
++i; //i加1
factorial = factorial.multiply(new BigDecimal(1.0/i)); //计算阶乘项
}
System.out.println("1+1/2!+1/3···1/20!的计算结果等于:\n"+sum); //输出计算结果
}
}
看了半天没看懂这个运算阶乘的原理和他的运算过程大概是什么形式请高手讲解一下。 展开
public class Cases027 {
public static void main(String[] args){
BigDecimal sum = new BigDecimal(0.0); //和
BigDecimal factorial = new BigDecimal(1.0); //阶乘项的计算结果
int i = 1; //循环增量
while(i<=20){
sum = sum.add(factorial); //累加各项阶乘的和
++i; //i加1
factorial = factorial.multiply(new BigDecimal(1.0/i)); //计算阶乘项
}
System.out.println("1+1/2!+1/3···1/20!的计算结果等于:\n"+sum); //输出计算结果
}
}
看了半天没看懂这个运算阶乘的原理和他的运算过程大概是什么形式请高手讲解一下。 展开
展开全部
有注释的还没看懂么。。
这里面的句子不多,反映你所谓的阶乘就一个语句,
factorial = factorial.multiply(new BigDecimal(1.0/i)); //计算阶乘项
其他是1~20的循环 应该看得懂吧。
然后你就会发现其实只涉及到一个问题就是 BigDecimal.multiply(BigDecimal) 是怎么算的。
根据API
multiplypublic BigDecimalmultiply(BigDecimal multiplicand)返回一个 BigDecimal,其值为 (this × multiplicand),其标度为
(this.scale() + multiplicand.scale())。
参数:multiplicand - 乘以此 BigDecimal 的值。
返回:this * multiplicand
关于SCALE的理解:21/110 = 0.190 // integer=190, scale=3
19/100=0.19//integer=19, scale=2
好了 回到开头的地方来,1+1/2!+1/3!·····1/20!
在这个循环里面
fac先等于1
循环之后fac = 1×1/2 = 1/2!
再循环之后 fac = 楼上的fac(1×1/2)×1/3 = 1/3!
。。。。
1~20的循环就等于你的等式了。
查API step by step
这里面的句子不多,反映你所谓的阶乘就一个语句,
factorial = factorial.multiply(new BigDecimal(1.0/i)); //计算阶乘项
其他是1~20的循环 应该看得懂吧。
然后你就会发现其实只涉及到一个问题就是 BigDecimal.multiply(BigDecimal) 是怎么算的。
根据API
multiplypublic BigDecimalmultiply(BigDecimal multiplicand)返回一个 BigDecimal,其值为 (this × multiplicand),其标度为
(this.scale() + multiplicand.scale())。
参数:multiplicand - 乘以此 BigDecimal 的值。
返回:this * multiplicand
关于SCALE的理解:21/110 = 0.190 // integer=190, scale=3
19/100=0.19//integer=19, scale=2
好了 回到开头的地方来,1+1/2!+1/3!·····1/20!
在这个循环里面
fac先等于1
循环之后fac = 1×1/2 = 1/2!
再循环之后 fac = 楼上的fac(1×1/2)×1/3 = 1/3!
。。。。
1~20的循环就等于你的等式了。
查API step by step
展开全部
new BigDecimal(1.0/i)
这个行计算的是: 1/n
factorial = factorial.multiply(new BigDecimal(1.0/i));
multiply 是乘法,也就是 factorial * 1/n
sum = sum.add(factorial);
就是加法
这个行计算的是: 1/n
factorial = factorial.multiply(new BigDecimal(1.0/i));
multiply 是乘法,也就是 factorial * 1/n
sum = sum.add(factorial);
就是加法
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以这样看,i=1时,sum=sum.add(1.0);//sum=1
i++;//i=2
factorial=1*(1/2)=1/2!;
然后是i=2了,sum=sum.add(1/2!);
i++;//i=3
factorial=(1/2!)*(1/3);//也就是1/3!
这样就很明显了,每次在计算factorial = factorial.multiply(new BigDecimal(1.0/i));之前,factorial 都是前面的那个阶乘,每次计算factorial的时候,都是用前面那个加数乘以一个1/i,比如要算n的阶乘的时候,就用( 1/(n-1)! ) * ( 1/n ),这个就是阶乘的计算了
i++;//i=2
factorial=1*(1/2)=1/2!;
然后是i=2了,sum=sum.add(1/2!);
i++;//i=3
factorial=(1/2!)*(1/3);//也就是1/3!
这样就很明显了,每次在计算factorial = factorial.multiply(new BigDecimal(1.0/i));之前,factorial 都是前面的那个阶乘,每次计算factorial的时候,都是用前面那个加数乘以一个1/i,比如要算n的阶乘的时候,就用( 1/(n-1)! ) * ( 1/n ),这个就是阶乘的计算了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
factorial = factorial.multiply(new BigDecimal(1.0/i));这句不就是么,每一次都用前面计算的乘积乘以1.0/i这里调用的是函数multiply
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询