我为这个问题写了这个数学解决方案,但由于某种原因,随着数字变得非常非常高,我得到的数字有点不正确,这是什么问题
`def sec_sol(n):
last_num_3=(n-1)-((n-1)%3)
last_num_5=(n-1)-((n-1)%5)
last_num_15 = (n-1)-((n-1)%15)
sums_of_3=((3+last_num_3)/2)*math.floor(last_num_3/3)
sums_of_5=((5+last_num_5)/2)*math.floor(last_num_5/5)
sums_of_15=((15+last_num_15)/2)*math.floor(last_num_15/15)`
您使用的是浮点,在 Python 中通常意味着 64 位浮点,这通常意味着 53 位精度。
如果您的输入足够大,这会导致准确性丢失。例如,当 n=183785194 时,只需打印一些中间值,我们就可以看到不准确之处:
n = 183785194
last_num_3 = 183785193
last_num_5 = 183785190
last_num_15 = 183785190
sums_of_3 = 5629499619567138.0 (correct = 5629499619567138)
sums_of_5 = 3377699698226205.0 (correct = 3377699698226205)
sums_of_15 = 1125899960670465.0 (correct = 1125899960670465)
sums_of_3 + sums_of_5 = 9007199317793344.0
result = 7881299357122879.0 (correct=7881299357122878)
您可以看到您的代码正确计算了此
sums_of_3
的 sums_of_5
、sums_of_15
和 n
,但结果相差了 1。这是因为 sums_of_3 + sums_of_5
在 Python 中无法用浮点数表示,您可以在最低小数位看到:正确的结果是奇数并且大于 2^53(53 是 Python 浮点精度的位数)点),即 9007199254740992。
您可以使用整数算术来修复您的程序,当您计算保证永远不会四舍五入的总和时,可以通过将“除以 2”移动到表达式的末尾来完成此操作。
last_num_3=(n-1)-((n-1)%3)
last_num_5=(n-1)-((n-1)%5)
last_num_15 = (n-1)-((n-1)%15)
sums_of_3=(3+last_num_3)*last_num_3//6
sums_of_5=(5+last_num_5)*last_num_5//10
sums_of_15=(15+last_num_15)*last_num_15//30