LeetCode#119 Pascal's Triangle II

1、首先,最笨的方法就是按照#118算完后取出相应行。
2、但是,根据二项式定理,我们可以知道,这实际上就是求每一项的系数,此时,可以利用公式这里写图片描述递推计算
当然,我们非常容易想到,n>=33,简单计算便知道超了,因此用64位。

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        if(rowIndex == 0)
            return {1};
        vector<int> row(rowIndex+1);
        row[0] = 1;
        for (int i = 1; i <= rowIndex; i++) {
            long long temp = row[i-1] * (rowIndex - i + 1) / i;
            row[i] = temp;
        }

        return row;
    }
};

问题来了:(1)、连续计算将错误已经溢出的结果赋给,64位。
(2)、除法只能最后算,否则必定取整导致出错。

for (int i = 1; i <= rowIndex; i++) {
            long long temp = row[i-1];
            temp *= (rowIndex - i + 1);
            temp /= i;
            row[i] = temp;
        }

除此之外,这里要注意两点:赋值时左边的计算与右边没有关系!同时乘除优先满足有符号数
(1)、

unsigned long long temp = row[i - 1] * (rowIndex - i + 1);

赋值时按照32位乘,同时按照有符号数的处理cdq

00CE7228  imul        edx,dword ptr [eax]  
00CE722B  mov         eax,edx  
00CE722D  cdq  
00CE722E  mov         dword ptr [ebp-3Ch],eax  
00CE7231  mov         dword ptr [ebp-38h],edx  
temp /= i;

尽管我们需要得到无符号,仍依照i采取有符号填充,因此实际上是利用无符号的64位除法__aulldiv()计算了一个完成补码扩充的数!必然错误

0CE7238  push        edx  
00CE7239  push        eax  
00CE723A  mov         eax,dword ptr [ebp-38h]  
00CE723D  push        eax  
00CE723E  mov         ecx,dword ptr [ebp-3Ch]  
00CE7241  push        ecx  
00CE7242  call        __aulldiv (0CE197Eh)  
00CE7247  mov         dword ptr [ebp-3Ch],eax  
00CE724A  mov         dword ptr [ebp-38h],edx  

因此,必须统一符号、计算与赋值分离

猜你喜欢

转载自blog.csdn.net/rpybd/article/details/81708783
今日推荐