euler icon indicating copy to clipboard operation
euler copied to clipboard

039 会计算重复

Open zgxkbtl opened this issue 4 years ago • 4 comments

https://pe.metaquant.org/pe039.html

对于同一个p,计算a和b可能重复,加个大小判断就可以

def number_of_solution(p):
    num = 0
    for a in range(1,p//3):
        if (p**2-2*p*a)%(2*p-2*a) == 0:
            if a > (p**2-2*p*a)//(2*p-2*a): break  # bug fixed here
            num += 1
    return num

def main(n=1000):
    d = {p:number_of_solution(p) for p in range(2,n+1,2)}
    ans = max(d,key=d.get)
    return ans

zgxkbtl avatar Dec 17 '21 16:12 zgxkbtl

感谢回复,但我在题解中已经假设,a <= b < c, 所以才得到a的取值为[1,p//3),所以a并不会大于b。

sorrowise avatar Dec 18 '21 14:12 sorrowise

当 p=2520 的时候,p/3=840,number_of_solution在代码运行过程中会把{720 756 1044}, {756 720 1044} 当成两组不同的解。

a , b 钧小于 p//3 是有可能出现的。

zgxkbtl avatar Dec 18 '21 14:12 zgxkbtl

是的,将上限设置为p/(2+Sqrt[2])是更好的行为

wang1zhen avatar Mar 20 '22 13:03 wang1zhen