我正在完成hackerrank的euler问题1计划。 我写了一个暴力解决方案来检查我的答案。它似乎是正确的,除了输入10^9。 我被告知正确答案是:
2333331666668
我回来了:
2333331666680
n = 1000000000
sum_of_multiples_3 = int((int((n-1)/3.0)+1) * (int((n-1)/3.0)/2.0) * 3)
sum_of_multiples_5 = int((int((n-1)/5.0)+1) * (int((n-1)/5.0)/2.0) * 5)
sum_of_multiples_15 = int((int((n-1)/15.0)+1) * (int((n-1)/15.0)/2.0) * 15)
print(sum_of_multiples_3 + sum_of_multiples_5 - sum_of_multiples_15)
您使用的是浮点除法,整数除法可以:
更好地表达为
例如,使用Python的floor division操作符,不要使用float,然后使用floor。你知道吗
当您将浮点运算扩展到极限之外时,使用整数楼层除法不会遇到舍入问题。你知道吗
当您将
n
推得足够大时,可以看到这种舍入错误:额外的1纯粹是因为您遇到了浮动的限制:
我不知道你为什么总是从
n
中减去一个;这根本不需要,而且会导致错误的结果。也许你是想补偿浮动舍入误差?正确的公式是:为任何
n
提供正确的输出:我会用一个函数来计算倍数:
因此,您可以通过与暴力总和进行比较来验证它是否有效:
然后用它来计算答案:
相关问题 更多 >
编程相关推荐