如何解决当需要在第30行找到值时,Pascal三角形整数溢出
这是Integer溢出问题,但是我不能只使用Integer作为解决方案[不使用long]。 我想知道当溢出发生而又不移至更高的数据类型时如何测试或形成方程式?
目标:尝试在i索引处找到帕斯卡三角形值;
rowIndex最多可以为33。
代码:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pt = new ArrayList<>();
int prev=1;
int curr=1;
int n=rowIndex+1;
pt.add(prev);
for (int i=1; i <= rowIndex; i++) {
curr = prev * (n-i)/i;
pt.add(curr);
prev=curr;
}
return pt;
}
解决方法
您可以使用long
而不是int
来防止溢出。
public List<Integer> getRow(int rowIndex) {
List<Integer> pt = new ArrayList<>();
int prev=1;
int curr=1;
int n=rowIndex+1;
pt.add(prev);
for (int i=1; i <= rowIndex; i++) {
curr = (int) ((long) prev * (n-i)/i);
pt.add(curr);
prev=curr;
}
return pt;
}
但是无需使用long
即可解决问题。
prev * (n-i)
部分可能会溢出,但是此产品应被i
整除。您可以通过在乘法之前进行除法来避免溢出。如果您预先计算(n-i)
和i
的GCD,则可以按以下方式重写。
int gcd = gcd(n - i,i);
curr = (prev / (i / gcd)) * ((n - i) / gcd);
GCD可以通过以下方法获得。
static int gcd(int m,int n) {
while (n > 0) {
int r = m % n;
m = n;
n = r;
}
return m;
}
之前:
[1,30,435,4060,27405,142506,593775,2035800,5852925,14307150,30045015,54627300,86493225,119759850,145422675,-131213633,-123012780,-101304642,-73164463,-46209134,-25415023,-12102391,-4950978,-1722079,-502273,-120545,-23181,-3434,-367,-25,0]
之后:
[1,155117520,1]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。