欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阶乘算法,Java实现任意范围阶乘之和!

程序员文章站 2022-07-15 14:39:29
...

上学期学的是入门级编程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++
阶乘算法,Java实现任意范围阶乘之和!
如果是用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的阶乘和的例子,这是部分结果:
阶乘算法,Java实现任意范围阶乘之和!每种语言都有它的有点,像这种科学计算,用python五六行就能搞定。不应该对哪一种编程语言有偏见。

技术之路永无止境,每个人生下来都不是编程高手,只要肯花时间。

最后说一句,Java很强大。

相关标签: Java java 算法