Python中处理大数的问题
我在解决一个关于codeforces的问题: 我编写了python代码来解决同样的问题:-Python中处理大数的问题,python,python-3.x,performance,division,Python,Python 3.x,Performance,Division,我在解决一个关于codeforces的问题: 我编写了python代码来解决同样的问题:- n=int(input()) print(0 if ((n*(n+1))/2)%2==0 else 1) 但是对于测试用例它失败了:19999997 尽管Python可以有效地处理大量数据,但为什么它失败了? 同样,当我在CPP中对其进行编码时,类似的逻辑也能完美地工作:- #包括 使用名称空间std; int main(){ int n; cin>>n; 长整型和=1ll*(n*(n+1))/2;
n=int(input())
print(0 if ((n*(n+1))/2)%2==0 else 1)
但是对于测试用例它失败了:19999997
尽管Python可以有效地处理大量数据,但为什么它失败了?
同样,当我在CPP中对其进行编码时,类似的逻辑也能完美地工作:-
#包括
使用名称空间std;
int main(){
int n;
cin>>n;
长整型和=1ll*(n*(n+1))/2;
如果@juanpa.arrivillaga和@DarrylG在评论中提到(sum%2==0)不能,我应该使用floor操作符/
进行整数除法,则异常是由/
除法操作符进行浮点除法引起的
因此,正确的代码应该是:-
n=int(input())
print(0 if (n*(n+1)//2)%2==0 else 1)
正如@juanpa.arrivillaga和@DarrylG在评论中提到的,我应该使用floor操作符/
进行整数除法,异常是由/
除法操作符进行浮点除法引起的
因此,正确的代码应该是:-
n=int(input())
print(0 if (n*(n+1)//2)%2==0 else 1)
根据@juanpa.arrivillaga的见解进行了测试,这是一个很棒的兔子洞:
number = 1999999997
temp = n * (n+1)
# type(temp) is int, n is 3999999990000000006. We can clearly see that after dividing by 2 we should get an odd number, and therefore output 1
divided = temp / 2
# type(divided) is float. Printing divided for me gives 1.999999995e+18
# divided % 2 is 0
divided_int = temp // 2
# type(divided_int) is int. Printing divided for me gives 1999999995000000003
//强制整数除法,并始终返回整数:7//2将等于3,而不是3.5
根据您链接的另一个答案,python中的int类型可以处理非常大的数字
浮点也可以处理大量的数字,但我们在跨语言表示浮点的能力方面存在问题。问题的关键在于,并不是所有的浮点都可以准确捕获:在许多场景中,1.9999999 5e+18和1.9999999 5000000003e+18之间的差异非常微小,无关紧要,但这是一个可以准确捕获的场景,正如您所关心的那样关于数字的最后一个数字
您可以通过观看此运行基于@juanpa.arrivillaga洞察的测试了解更多信息,这是一个很棒的兔子洞:
number = 1999999997
temp = n * (n+1)
# type(temp) is int, n is 3999999990000000006. We can clearly see that after dividing by 2 we should get an odd number, and therefore output 1
divided = temp / 2
# type(divided) is float. Printing divided for me gives 1.999999995e+18
# divided % 2 is 0
divided_int = temp // 2
# type(divided_int) is int. Printing divided for me gives 1999999995000000003
//强制整数除法,并始终返回整数:7//2将等于3,而不是3.5
根据您链接的另一个答案,python中的int类型可以处理非常大的数字
浮点也可以处理大量的数字,但我们在跨语言表示浮点的能力方面存在问题。问题的关键在于,并不是所有的浮点都可以准确捕获:在许多场景中,1.9999999 5e+18和1.9999999 5000000003e+18之间的差异非常微小,无关紧要,但这是一个可以准确捕获的场景,正如您所关心的那样关于数字的最后一个数字
通过观看您正在使用的float
对象,您可以了解更多有关这方面的信息,这将是在Python中使用/
运算符的结果使用整数除法运算符,即/
而不是浮点除法/
。C的不同之处在于,整数除法是使用整数参数执行的。是的,我只是错过了…谢谢大家!@DarrylG在Python2.7和更早版本中,整数之间的除法与C中的除法工作原理相同。Python3.0改变了它,因为他们觉得太多人感到困惑。这只是证明了你不能赢。你正在使用float
对象,这将是使用//code>操作符的结果Python使用整数除法运算符,即/
而不是浮点除法/
。C的不同之处在于,整数除法是使用整数参数执行的。是的,我只是遗漏了一点……谢谢大家!@DarrylG在Python 2.7及更早版本中,整数之间的除法与C中的除法工作原理相同。Python 3.0改变了这一点,因为嘿,我觉得有太多人感到困惑了。这只是证明你赢不了。