【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乘法溢出-创新互联
网页URL:http://pwwzsj.com/article/dhpdgc.html