找到一个不小于给定数字的除数 - 优化

时间:2015-07-08 13:48:32

标签: algorithm language-agnostic numbers

这是关于俄罗斯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之上的那个,并返回它。还有更多可能的优化吗?这是一个优化吗?

1 个答案:

答案 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