大家好,又见面了,我是你们的朋友全栈君。
说的可能比较啰嗦。
在洛谷P2181 对角线 问题中,按照高中所学的组合数可推答案为Cn4(该题题解中有详细过程,这里不多赘述),问题在本文中并不重要。
但题中有一个有意思的点,就是题目的答案是非常大的,用long long都不行,c++中需要用unsigned long long,自然,我就想到python中的int类型范围与内存挂钩,(一般可理解能取到该系统的最大值)
代码如下
m = int(input())
n = int(m*(m-1)/2*(m-2)/3*(m-3)/4)
# 首先大家可以注意一个点,我在这里注意到了要把结果转换为int类型
print(n)
那么大家可以运行一下这个程序,其实如果精度较低的情况下,答案是没有问题的,但是此题正好碰到了它的最高精度,会发现结果相差不多,导致我没有全ac,于是我开始探寻原因 其实我最开始没有主要float类型,直到一个dl告诉我把他改为这样就好
代码如下
m = int(input())
n = m*(m-1)//2*(m-2)//3*(m-3)//4
print(n)
此时,我才想起来python内部将“/”默认为float除法,根据计算机给予的float类型的精度本身就是小于c++中的unsigned long long类型 查阅为2的53次方,自然不满足题意,float就会取一个近似值(这不糊弄人吗?[doge])
上边代码应该时最简单的改法了,但是其实还有一种改法 就是提高精度(利用python中的decimal模块)即可。
代码如下
import decimal
m = decimal.Decimal(int(input()))
n = int(m*(m-1)/2*(m-2)/3*(m-3)/4)
print(n)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156030.html原文链接:https://javaforall.cn