获得给定数字的因子乘积的组合

时间:2015-10-14 10:53:50

标签: python algorithm numbers

我不确定此问题是否在之前发布,在搜索之后,我找不到它。

问题:给一个号码,打印所有因子产品。

示例:

Given number: 20

Output: 1 * 20
        2 * 10
        2 * 2 * 5
        4 * 5

Given number: 30

Output: 1 * 30
        2 * 15
        2 * 3 * 5
        3 * 10
        5 * 6

以下是我的想法:

解决方案1。

  • 步骤1)首先,获取此数字的所有素数因子

    def get_prime_factors(n):
        factors = []
        if n == 0:
            return factors
    
        # Get the number of 2s that divide n
        while n%2 == 0:
            factors.append(2)
            n /= 2
    
        # n must be odd
        for i in range(3, int(ceil(sqrt(n))), 2):
            while n%i == 0:
                factors.append(i)
                n /= i
    
        # handle the case n is prime number greater than 2s
        if n > 2:
            factors.append(n)
    
        return factors
    
  • 步骤2)然后得到这些因素的组合

我计划通过组合获得所有因子产品,但是,我坚持如何在这种情况下处理这些重复因素?(问题1)

解决方案2:

通过回溯方法解决。

def get_factors_recv(n, cur_ret, ret):
    for i in range(2, int(ceil(sqrt(n)))):
        if n%i == 0:
            fact_arr = [i, n/i]
            # add the current value to current result
            cur_ret.extend(fact_arr)
            if sorted(cur_ret) not in ret:
                ret.append(sorted(cur_ret))
                # backtracking
                cur_ret = cur_ret[:-2]
                get_factors_recv(n/i, cur_ret + [i], ret)


def get_all_factors_product(n):
    if n == 0:
        return '';

    result = []
    # push the simple factor multiplier
    result.append([1, n])

    get_factors_recv(n, [], result)

    return result
  • 我想知道以上代码有优化吗?(问题2)
  • 有没有更好的解决方案来解决它? (问题3)

2 个答案:

答案 0 :(得分:1)

简单的while循环可以解决您的第一个重复问题。给出一个数字:

num_list = []
i = 2;
num = 72*5*5*19*10

while i &lt=num:
    if(num%i == 0):
        num_list.append(i)
        num = num/i
    else:
        i = i + 1


print num_list

num_list将包含因子。我们的想法是不增加索引变量,直到数字不再被它整除。此数字在每次除法后仍然会减少,因此循环实际上会比实际数字少得多。而不是

while i&lt=num

您也可以使用

while i&lt=num/2

这在数学上是正确的,并导致进一步减少迭代次数。

这将为您提供所有因素。

答案 1 :(得分:0)

希望这有帮助。

Process: com.example.ky.tamil, PID: 6286
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ky.tamil/com.example.aeiltech.tamil.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2436)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2498)
        at android.app.ActivityThread.access$900(ActivityThread.java:179)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5641)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1288)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalArgumentException: column '_id' does not exist