阶乘算法,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]内整数阶乘和的问题迎刃而解。

现在,我想要升级一下这个程序,让它可以实现任意范围的阶乘和,如下:

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五六行就能搞定。不应该对哪一种编程语言有偏见。

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

猜你喜欢

转载自blog.csdn.net/pineapple_C/article/details/104496641