Java不溢出计算1!+2!+3!+...+100!

偶然机会发现了在Java中有两个特别的类BigDecimal和BigInteger,他们分别可以存储非常大的浮点型变量和整型变量,API文档的说明如下:
API文档搜索结果截图 用这个类可以表示任意精度的整数,只要你的电脑内存够大。继续往下翻,可以看到这个类提供了很多可调用的方法,结合这道题目,我觉得这么几个方法我们可能会用上:

*首先是一个构造方法,可以通过一个字符串构造一个BigInteger变量

BigInteger
public BigInteger(String val)将 BigInteger 的十进制字符串表示形式转换为 BigInteger。该字符串表示形式包括一个可选的减号,后跟一个或多个十进制数字序列。字符到数字的映射由 Character.digit 提供。该字符串不能包含任何其他字符(例如,空格)。
 参数:
 val - BigInteger 的十进制字符串表示形式。 
 抛出: 
 NumberFormatException - val 不是 BigInteger 的有效表示形式。

*然后是加法、乘法和除法运算方法

**add**
public BigInteger add(BigInteger val)返回其值为 (this + val) 的BigInteger。 
参数:
val - 将添加到此 BigInteger 中的值。 
返回:
this + val

**multiply**
public BigInteger multiply(BigInteger val)返回其值为 (this * val) 的 BigInteger。
参数:
val - 要乘以此 BigInteger 的值。 
返回:
this * val

**divide**
public BigInteger divide(BigInteger val)返回其值为 (this / val) 的 BigInteger。
参数:
val - 此 BigInteger 要除以的值。 
返回:
this / val 
抛出: 
ArithmeticException - val==0

那么如此一来,我们就可以轻易的计算出这个表达式了,下面贴上代码:

import java.math.BigInteger;
public class Task3_3 {
	public static void main(String[] args) {
	// TODO Auto-generated method stub
	BigInteger bignum1 = new BigInteger("1");
	BigInteger bignum2 = new BigInteger("0"); 		
	int n=1;
	while(n<=100) {
		bignum1=bignum1.multiply(BigInteger.valueOf(n));			
		bignum2=bignum2.add(bignum1);
		n++;
	}
	System.out.println(bignum2.toString());
	}
}

这个程序中,笔者创建了两个BigInteger的对象bignum1和bignum2,前者用于存储阶乘的结果,后者存储累加的结果,对于这两个变量的初始化可以通过上面提到的构造函数,以字符串转换的方式实现初始化:

  BigInteger bignum1 = new BigInteger("1");
  BigInteger bignum2 = new BigInteger("0");

为了提高程序执行的效率,根据题目的特点,没有使用传统的重复计算阶乘的方法,因为我们注意到,当计算n!时实际上就等于是(n-1)!*n而 (n-1)!前面已经计算过了,我们就没有必要再去计算一遍了,所以可以重复利用前一步计算的结果,每乘一个数就把前面的结果加一遍,通过一层循环就可以计算出结果,从而大大减小程序的时间复杂度,代码实现如下:

//重复利用前(n-1)次的计算结果以降低程序的时间复杂度
int n=1;
while(n<=100) {
	bignum1=bignum1.multiply(BigInteger.valueOf(n));			
	bignum2=bignum2.add(bignum1);
	n++;
}

最后在打印输出的时候将bignum2转换成字符串后直接输出即可:

System.out.println(bignum2.toString());

最后计算的结果就是这么一个超级天文数字:
94269001683709979260859834124473539872070722613982672442938359305624
67822347950602340029409359913646698660912434743264762282687003822055
6442336528920420940313


  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 Java大作业基于JavaSwing实现的模拟程序员计算器源码+项目说明.zip 课题要求: 基本要求: `已完成`按照TI 程序员计算器(1982 年LCD版本)的原始面板键盘和显示布局设计出计算器的交互窗口. `已完成`实现 10 进制和 16 进制的基础算术运算。即不含括号的单步加减乘除运算。 提高要求: `已完成`实现输入的 10 进制和 16 进制之间的相互转换 `已完成`实现与、或、异或、 `已完成`反码、补码和移位运算 `已完成`实现单一进制模式下的带括号的组合多步运算 `已完成`实现混合进制模式下带括号的组合多步运算 `已完成`设计运算溢出等出错提示。 备注 课题要求中给出的基本要求和提高要求将作为评分依据,根据大作 业评分标准进行评分,在基本要求和提高要求以外实现的其它功能不作为评分依据。 本大作业课题中设计实现的计算器不需要进行以八进制以及二进制输入输出的据转 换或计算。 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值