阶乘算法,Java实现任意范围阶乘之和!
上学期学的是入门级编程C语言,然后寒假又在家里拓展了一下C++的知识,发现我已经爱上了C/C++。完美的格式,完美的函数,一个程序下来,就是一个艺术啊。
但是C++也有很多的不足之处,它更偏向于底层,而且不可以跨平台。
刚开始接触Java的时候,我是有些抵触的心理的(当然不是歧视哈),直到有一题,求1!+2!+3!+…+100!。可把我难住了。因为光是100的阶乘就是100多位的天文数字啊,在C++中无论是int 型,long int型还是unsigned long int型都装不下这么大的数字,可是即使装不下,我也要把模型想出来啊,也就打个比方1到10的阶乘和吧。
于是在C++1到10的整数阶乘和的代码中如下:
#include <iostream>
using namespace std;
int main()
{
int a=10,b;
int c;
int d[a];
do
{
c=a;
for(b=a-1;b>0;b--)
{
c=c*b;
}
d[a]=c;
a--;
}while(a>0);
int sum=0;
for(a=10;a>0;a--)
{
sum+=d[a];
}
cout<<"整数1-10的阶乘之和为:"<<sum<<endl;
return 0;
}
正确结果如下,由于是测试的小程序,我就用了轻便快捷的DEV-C++
如果是用C++继续做1-100的阶乘和的话,大家都会想到用数组的方法,把巨大的数值放入数组里,问题迎刃而解。
可是这涉及到乘法的一些规律的问题,我的数学基础不是很好,就没有研究下去(哈哈哈)
接着我就注意到了Java的BigDecimal这个类,使用这个类和其方法可以实现高精度的计算,绝大多数是算小数问题的,当然算这么大的数也没问题了。
于是在Java中1-100内整数阶乘和的问题迎刃而解。
但是实现的过程确实很艰辛,花了我一个晚上加一个上午的时间才搞定,毕竟刚接触Java,对BigDecimal类及其方法不是很了解,还有之前学习C++一直是用VS2019,这次换了Eclipse很是不习惯,连调试和单步调试都没搞会。无可奈何只好求助于强大的VS code,因为其风格和VS2019很相似,容易上手,把环境搭建好后,问题终于解决了。
现在,我想要升级一下这个程序,让它可以实现任意范围的阶乘和,如下:
import java.math.*;
/*
类名称:EX02
功能描述:计算区间[i,j]内所有整数阶乘之和
修改记录:
*/
public class EX02 {
public static void main(String[] args) {
final int i = 1; // 设置区间起始点
final int j = 100; // 设置区间结束点
BigDecimal end = new BigDecimal(j);
BigDecimal one = new BigDecimal(1);
BigDecimal start = new BigDecimal(i - 1);
BigDecimal b = end;
BigDecimal[] d = new BigDecimal[j + 1];
do {
BigDecimal c = end;
for (b = end.subtract(one); b.compareTo(start) > 0; b = b.subtract(one)) {
c = c.multiply(b);
}
d[end.intValue()] = c;
System.out.printf("%d! = ", end.intValue());
System.out.println(d[end.intValue()]);
end = end.subtract(one);
} while (end.compareTo(start) > 0);
BigDecimal sum = new BigDecimal(i - 1);
for (BigDecimal end1 = new BigDecimal(j); end1.compareTo(start) > 0; end1.subtract(one)) {
sum = sum.add(d[end1.intValue()]);
end1 = end1.subtract(one);
}
System.out.printf("以上是区间[%d,%d]每个整数的阶乘\n以下是区间[%d,%d]所有整数阶乘之和 sum:\n", i, j, i, j);
System.out.println(sum);
}
}
这就是一个1-100的阶乘和的例子,这是部分结果:
每种语言都有它的有点,像这种科学计算,用python五六行就能搞定。不应该对哪一种编程语言有偏见。
技术之路永无止境,每个人生下来都不是编程高手,只要肯花时间。
最后说一句,Java很强大。
推荐阅读