为了账号安全,请及时绑定邮箱和手机立即绑定

数字分解。

数字分解。

杨__羊羊 2021-08-14 13:42:24
任务是编写将数字折叠为质因数的函数。根据给定的数字“n”,此函数应返回元组列表p_i,c^i,例如,如果输入为 100,则输出为 (2,2),(5,2)。所以,这是我尝试编写它的方式:def factor(n):c = 1pre_ans = list()temp_n=nfor 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 /= iprint(pre_ans)它工作错误,但我找不到错误:(
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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


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


查看完整回答
反对 回复 2021-08-14
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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


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))


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号