场景:求2021分解为五个正整数和的方法有多少种。
考虑数学方法
* 可以把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乘法溢出-创新互联
文章位置:https://www.cdcxhl.com/article12/dhpdgc.html
成都网站建设公司_创新互联,为您提供动态网站、网站策划、虚拟主机、微信公众号、网站导航、企业网站制作
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联