欧拉项目 #1:3 和 5 的倍数不适用于大数

问题描述 投票:0回答:1

我为这个问题写了这个数学解决方案,但由于某种原因,随着数字变得非常非常高,我得到的数字有点不正确,这是什么问题

`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 math
1个回答
0
投票

您使用的是浮点,在 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
© www.soinside.com 2019 - 2024. All rights reserved.