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;

我在解决一个关于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;

如果@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改变了这一点,因为嘿,我觉得有太多人感到困惑了。这只是证明你赢不了。