【问题标题】:Numbers factorization数字因式分解
【发布时间】:2018-11-10 20:46:18
【问题描述】:

任务是编写将数字折叠成素数的函数。通过给定数字“n”,此函数应返回元组列表 p_i,c^i,例如,如果输入为 100,则输出为 (2,2),(5,2)。 所以,这就是我尝试写它的方式:

def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2,temp_n+1):
    if (is_prime(i) == True) and (temp_n % i == 0):
        for j in range (2,temp_n+1):
            if (temp_n % (i ** j) == 0):
                pre_ans.append((i,j))
                temp_n /= (i **j)
        pre_ans.append((i,c))
        temp_n /= i
print(pre_ans)

它工作错了,但我找不到错误:(

【问题讨论】:

  • is_prime 是函数:def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
  • 你有什么问题?
  • 另外,您为什么没有将is_prime 作为正确编辑的函数包含在您的问题中?请编辑它。
  • 我的问题是为什么这个确切的代码不能正常工作,尽管我发现它在意识形态上是正确的。如果我做错了,请纠正我
  • 请提供给定输入的代码输出示例。

标签: python python-3.x primes factorization


【解决方案1】:

你的总体思路没问题。但是,您的代码的以下部分存在一些小问题:

for j in range (2,temp_n+1):
    if (temp_n % (i ** j) == 0):
        pre_ans.append((i,j))
        temp_n /= (i **j)
pre_ans.append((i,c))
temp_n /= i

其实主要的问题是你需要在这个语句for j in range (2,temp_n+1)的另一个方向上进行迭代。如果你像这样重写它

def factor(n):
    c = 1
    pre_ans = list()
    temp_n=n
    for i in range(2,temp_n+1):
        if (is_prime(i) == True) and (temp_n % i == 0):
            for j in range (temp_n+1, 0,-1):
                if (temp_n % (i ** j) == 0):
                    pre_ans.append((i,j))
                    temp_n /= (i **j)
    print(pre_ans)

它会起作用的。整个代码也可以写得更短一些:

from collections import Counter

def factor(n):
    lst = []
    for i in range(2, n+1):
        while n % i == 0:
            lst.append(i)
            n = n / i
    return Counter(lst).items()

print(factor(100))

【讨论】:

  • 这与问题根本有什么关系?
  • 这不是一个简短的解决方案。你在哪里处理一个元组列表,你在哪里给出素数?这几乎就像您刚刚从另一个问题中转储了代码。
  • @roganjosh 元组列表由 Counter 函数返回。不需要自己做。
【解决方案2】:

修复了代码。这是工作版本

def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2, n // 2 + 1):
    if (is_prime(i) == True):
        k = 1
        while temp_n % (i ** k) == 0:
            if temp_n % (i ** (k + 1)) == 0:
                k += 1
            else:
                k += 1
                break
        if k > 1:
            pre_ans.append((i, k - 1))
return pre_ans

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2011-02-08
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多