当需要在第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]