我正在尝试Project Euler problem 484。我正处于问题的开始阶段,我只是在搜索数字中的模式。
问题要求我找到一个"算术导数"。例如,要找到60的算术导数:
60 = 2 ^ 2 * 3 ^ 1 * 5 ^ 1
60' =(2/2 + 1/3 + 1/5)* 60 = 92
我利用内置的primefac算法,并为算术导数创建了一种方法。这是我的代码:
import primefac
def ad(n):
ans = 0
for i in set(primefac.primefac(n)):
ans += 1.0*list(primefac.primefac(n)).count(i)/i
return n*ans
print ad(30) , 31.0 // PRINTS 31.0 31.0
print int(ad(30)) // PRINTS 30
print ad(30) == 31.0 // PRINTS False
Python将31.0作为int转换为30.这是浮点错误吗?更令人困惑的是ad(30)
打印31.0但在相互评估时返回False。
答案 0 :(得分:2)
是的,这是一个浮点问题。有一个简单的解决方法,但是......因为n
总是按照定义可以被i
整除,所以你可以完全删除浮点数学:
def ad(n):
ans = 0
for i in set(primefac.primefac(n)):
ans += n * list(primefac.primefac(n)).count(i) // i
return ans