快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

【Java】long乘法溢出-创新互联

场景:求2021分解为五个正整数和的方法有多少种。

创新互联公司是一家专注于做网站、成都做网站与策划设计,龙井网站建设哪家好?创新互联公司做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:龙井等地区。龙井做网站价格咨询:18982081108

考虑数学方法

* 可以把2021看成2021个1的数列,采用1中间取间隔的方法分成5段

* 如5分解为三个数和: 1 | 1 1 | 1 1         4个间隔分两段

* 那么2021分解为五个正整数和: 2020个间隔分4段 C(4,2020) = 2020*2019*2018*2017/4*3*2

而在Java中计算这个答案,出错。

long sum = (2020*2019*2018*2017)/(4*3*2);//出错

甚至一开始都不知道错了,算出的答案如下:

8582718

自己用电脑自带的计算器算后发现答案是691677274345。

查询后发现在1024*1024*1024*2-1是2的31次方-1,正好是int的表示范围,我的分子早就超过这个范围,右边表达式默认按照int来,先Int计算,再转换为long。

所以只要将乘数表示为long,即在后面加上L标志,就不会溢出。

long sum = (2020*2019*2018L*2017)/(4*3*2);
System.out.println(sum);//691677274345

注意L要加在快溢出的数后面,因为我一开始加到了分子表达式的2017后面,和没加一样。。。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:【Java】long乘法溢出-创新互联
转载源于:http://6mz.cn/article/dhpdgc.html

其他资讯