python 不是用来处理整数溢出的吗?

Is python not made to handle integer overflows?

所以,我正在尝试一个编程难题,它是 -> (虽然,谜题是什么,与我的问题无关,但如果某些上下文需要的话)

给你一个只读数组,其中包含从 1 到 n 的 n 个整数。

每个整数只出现一次,除了 A 出现两次,B 不出现。

Return A 和 B.

我尝试使用相同的逻辑(仅进行语法更改)在 Python-3 中实现代码,就像下面的 C++ 代码一样。

vector<int> Solution::repeatedNumber(const vector<int> &A) {

    long long int act_sum = 0;
    long long int act_sum_sq = 0;
    long long int exp_sum;
    long long int exp_sum_sq;
    long long int i = 0;

    for(i = 0; i < A.size(); i++){
        act_sum = act_sum + (long long int)A[i];
        act_sum_sq = act_sum_sq + (long long int)A[i]*A[i];
    }

    exp_sum = (long long int)(A.size())*(A.size()+1)/2;
    exp_sum_sq = (long long int)(A.size())*(A.size()+1)*(2*A.size()+1)/6;

    long long int diff_sum_sq = exp_sum_sq - act_sum_sq;
    long long int diff_sum = exp_sum - act_sum;

    long long int tog = diff_sum_sq/diff_sum;

    long long int mis = (tog + diff_sum)/2;
    long long int rep = mis - diff_sum;

    vector<int> sol;
    sol.push_back((int)rep);
    sol.push_back((int)mis);

    return sol;
}

Python 代码 ->

class Solution:
    # @param A : tuple of integers
    # @return a list of integers

    def repeatedNumber(self, A):
         act_sum = 0
         act_sum_sq = 0
         exp_sum=0
         exp_sum_sq=0
         i = 0
         size=len(A)

         for i in range(size):
            act_sum = act_sum + A[i]
            act_sum_sq = act_sum_sq + A[i]*A[i]


         exp_sum = (size)*(size+1)/2
         exp_sum_sq =(size)*(size+1)*(2*size+1)/6

         diff_sum_sq = exp_sum_sq - act_sum_sq
         diff_sum = exp_sum - act_sum

         tog = diff_sum_sq/diff_sum

         mis = (tog + diff_sum)/2
         rep = mis - diff_sum



         return [int(rep),int(mis)]

python 中编写的代码在挑战网站上给出了部分正确的答案,(它给出了代码可能因较大的测试用例而失败的原因——比如数组中有大约 2000 个元素) 但, C++ 中的相同代码(仅语法更改)绝对可以正常工作! 为什么? 那么,C++ 中 long long int 的存在会是这背后的原因吗? python 不适合大数据集吗?如果没有,那么如何处理 python

中的溢出

你的问题出在这几行:

exp_sum = (long long int)(A.size())*(A.size()+1)/2;
exp_sum_sq = (long long int)(A.size())*(A.size()+1)*(2*A.size()+1)/6;

对比

exp_sum = (size)*(size+1)/2
exp_sum_sq =(size)*(size+1)*(2*size+1)/6

exp_sum在C++版本中的类型是long long int。在 python 中它是 float(相当于 C++ double)。 python 中的转换发生在除法中。 python3 always returns a float 中正常除法。您可以改用这些行来修复 python 代码:

exp_sum =  size * (size + 1) // 2
exp_sum_sq =  size * (size + 1) * (2 * size + 1) // 6

通过此修复,python 版本应该没有更多限制 – 与 C++ 不同,python 整数可以容纳任意大的值并且永远不会溢出。