有一题,求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五六行就能搞定。不应该对哪一种编程语言有偏见。
技术之路永无止境,每个人生下来都不是编程高手,只要肯花时间。