这是关于俄罗斯Stack Overflow问题的重新发布。
原始任务是:
对于两个给定的整数s和p,s&lt; = p,找到一个数d,使得s <= d; p%d = 0并且对于任何数字x,s <1。 x&lt; d,p%x非零。
提出的解决方案尽可能简单。对于数字(s,sqrt(p)),尝试将p除以数字,如果找到具有零余数的数字,则返回该数字。如果两者都没有产生零余数,则向后(s-1,1)执行相同的操作,对于找到的x,返回p / x。
如何优化此算法?我认为p的分解是一个优化,如果p是素数,或者p是几个小素数的乘法。所以我认为可以对p进行分解,根据因子分解创建一个p的所有可能除数的列表,并找到刚好在s之上的那个,并返回它。还有更多可能的优化吗?这是一个优化吗?
答案 0 :(得分:-1)
您始终可以从p/2
开始,然后使用p/next-prime
直到s。这可以保证找到可以均匀划分数字p的最大数字。
def f(s, p) {
prime = 2
while((divisor = p / prime) > s) {
if(p % prime == 0) return divisor
prime = next_prime(prime)
}
return 1 // prime
}
真正的优化机会是next_prime()结果是否可以缓存或预先计算。
修改:更正为return divisor
而不是return p