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 整数可以容纳任意大的值并且永远不会溢出。
所以,我正在尝试一个编程难题,它是 -> (虽然,谜题是什么,与我的问题无关,但如果某些上下文需要的话)
给你一个只读数组,其中包含从 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 整数可以容纳任意大的值并且永远不会溢出。