鱼C论坛

 找回密码
 立即注册
查看: 1558|回复: 16

[已解决]分解质因数

[复制链接]
发表于 2020-4-24 22:49:00 | 显示全部楼层 |阅读模式
10鱼币
大佬们,我正在写一个分解质因数的代码,我把自己都写蒙了

我现在的思路是:写两个函数,一个用来获取因数,另一个人用来判断是不是质数,如果是那就把那个数加到一个列表里,如果不是就用那个数作为参数在运行第一个函数


Snipaste_2020-04-24_22-44-19.png

这是我现在的代码:
zhishu = []
def zs(g):
    for z in range(2,g):
        if num%z == 0:
            d = True
            break
        else:
            d = False
    if d:
        zhishu.append(g)
    else:
        zys(g)

def zys(n):
    for yinshu in range(2,n):
        if num%yinshu == 0:
            zs(yinshu)
        else:
            zys(v)

print('\n---------------------------分解质因数---------------------------\n')
num = int(input('请输入一个数字:'))

v = num
zys(v)
print(zhishu)

我感觉是zys这个函数有些问题,求大佬指点
最佳答案
2020-4-24 22:49:01
最直接(暴力)的思路:
例如
求20的质因数,找到2并存储2,然后20除找到的质因数(2)等于10。
求10的质因数,找到2并存储2,然后10除找到的质因数(2)等于5。
求5的质因数...循环上述步骤
def zys(num):                                           #求质因数
    while num > 1:
        for yinshu in range(2,num+1):
            if num % yinshu == 0:
                zhiyinshu.append(yinshu)
                break
        num //= yinshu

def show_zys():                                         #显示质因数
    print(str(num) + ' = ', end = '')
    for i in range(len(zhiyinshu)):
        if i != len(zhiyinshu) - 1:
            print(str(zhiyinshu[i]) + '×', end = '')
        else:
            print(zhiyinshu[i])
        
zhiyinshu = []
num = int(input('请输入一个数字:'))
zys(num)
show_zys()

结果
请输入一个数字:20
20 = 2×2×5
请输入一个数字:23
23 = 23

最佳答案

查看完整内容

最直接(暴力)的思路: 例如 求20的质因数,找到2并存储2,然后20除找到的质因数(2)等于10。 求10的质因数,找到2并存储2,然后10除找到的质因数(2)等于5。 求5的质因数...循环上述步骤 结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-24 22:49:01 | 显示全部楼层    本楼为最佳答案   
最直接(暴力)的思路:
例如
求20的质因数,找到2并存储2,然后20除找到的质因数(2)等于10。
求10的质因数,找到2并存储2,然后10除找到的质因数(2)等于5。
求5的质因数...循环上述步骤
def zys(num):                                           #求质因数
    while num > 1:
        for yinshu in range(2,num+1):
            if num % yinshu == 0:
                zhiyinshu.append(yinshu)
                break
        num //= yinshu

def show_zys():                                         #显示质因数
    print(str(num) + ' = ', end = '')
    for i in range(len(zhiyinshu)):
        if i != len(zhiyinshu) - 1:
            print(str(zhiyinshu[i]) + '×', end = '')
        else:
            print(zhiyinshu[i])
        
zhiyinshu = []
num = int(input('请输入一个数字:'))
zys(num)
show_zys()

结果
请输入一个数字:20
20 = 2×2×5
请输入一个数字:23
23 = 23
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-24 23:47:58 | 显示全部楼层
yin = []
            
def zys(n):
    for yinshu in range(2,n+1):
        if n % yinshu == 0 and  yinshu != n:
            h = n // yinshu
            yin.append((yinshu,h))

        elif yin == [] and yinshu == n:
                print('此为质数')
    if yin != []:
        for each in yin :
            print(each)

print('\n---------------------------分解质因数---------------------------\n')
num = int(input('请输入一个数字:'))
zys(num)
想说,只需要一个函数就能解决的问题,没必要搞的太复杂,可以先写一下思维导图或具体思路吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 07:22:46 | 显示全部楼层
def intFactorization(n: int, /) -> list:
    if isinstance(n, int) and n>0:
        res=[]

        while not n&1:
            n>>=1
            res.append(2)
        
        temp=3
        maximum=floor(sqrt(n))

        while temp<=maximum:
            if not n%temp:
                while not n%temp:
                    n//=temp
                    res.append(temp)

                maximum=floor(sqrt(n))

            temp+=2

        if n!=1:
            res.append(n)

        return res
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 10:01:38 | 显示全部楼层
num = int(input("请输入一个合数:"))
n = num
list1 = []  #存放质因数
for j in range(int(n/2)+1):
    for i in range(2,n):
        if num % i == 0:  #可以整除
            list1.append(i)
            num = num // i
            break
if len(list1) == 0:
    print("此数是是质数,请重新输入另一个数")
    exit()
#print(list1)
print('%d = '%(n),end='')
for i in range(len(list1)):
    if i  == len(list1)-1:
        print('%s' % (list1[i]))
    else:
        print('%s * ' % (list1[i]),end='')

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
WangJS + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 10:32:41 | 显示全部楼层
兔子BUNNY 发表于 2020-4-25 09:31
先给一下建议:
1.变量在使用前一定要定义,要学会看红色的错误提醒
2.函数是封装的,所以要使用内置的参 ...

你说的第4点不对,那叫递归。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 10:49:18 | 显示全部楼层
while 1:
    num = int(input('输入一个数'))

    def num_split(number):
        
        k = []#用来存放被拆分的数
        while True:
            for i in range(2,number+1):#在2到number 查找
                if number %i == 0:
                    k.append(i)
                    number = int(number/i) #被i进行拆分
                    break
            if number<=1:#当for 遍历已经挑不到的时候退出
                break
        
        return k

    print(num_split(num))

               

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
WangJS + 5 + 3 + 3 感谢大佬

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-25 10:55:29 | 显示全部楼层
沐羽尘 发表于 2020-4-24 23:47
想说,只需要一个函数就能解决的问题,没必要搞的太复杂,可以先写一下思维导图或具体思路吧

你这个好像不对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-25 10:57:41 | 显示全部楼层

第一行和第六行的语法我都不明白啊

-> 是语法么?
还有这个 >>=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 17:23:32 | 显示全部楼层
WangJS 发表于 2020-4-25 10:55
你这个好像不对啊

本来这个函数判断输入是否为质数,不是的话返回一个包含其因数的列表
看了一下最佳答案是要求返回的所有数都是质数
emmm这也不难
def resolve(x):
    try:
        assert x > 1
        zhi = []
        z = x
        while x > 1:
            for each in range(2,x+1):
                if x % each == 0 :
                    zhi.append(each)
                    x = x // each
                    break            
        if len(zhi) > 1 :
            h =''
            for each in zhi:
                h += ' '+str(each)+' '+'*'
            h = h[:len(h)-1] + '='+' '+str(z)
            return h
        else:
            return'此为质数'
    except AssertionError:
        return'请不要输入不正确的数'
        
x = int(input('请输入大于1的整数:'))
y = resolve(x)
print(y)
结果如下
请输入大于1的整数:11
此为质数
请输入大于1的整数:12
 2 * 2 * 3 = 12
请输入大于1的整数:0
请不要输入不正确的数
要是没有bug就不用回我了,就酱紫
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 17:51:08 | 显示全部楼层
质因数 返回的不是 质数和幂次吗? 比如9 写作3^2 那么返回3 3不符合质因数分解要求,质因数分解要求 每个质数只出现一次,幂次可以不是1
比如 20 = (2^2)x(5^1)这个才是质因数分解的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 18:08:47 | 显示全部楼层
WangJS 发表于 2020-4-25 10:57
第一行和第六行的语法我都不明白啊

-> 是语法么?

-> 是注释,代表返回值
>>=1 就是 //=2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-25 18:25:47 | 显示全部楼层
TJBEST 发表于 2020-4-25 17:51
质因数 返回的不是 质数和幂次吗? 比如9 写作3^2 那么返回3 3不符合质因数分解要求,质因数分解要求 每个 ...

我们小学没要求这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-27 17:42:59 | 显示全部楼层
for i in range(len(zhiyinshu)):
        if i != len(zhiyinshu) - 1:
            print(str(zhiyinshu[i]) + '×', end = '')
        else:
            print(zhiyinshu[i])
最佳答案的第二部分没看懂啊,有大佬能分步详细解释下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 18:30:55 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-25 18:08
-> 是注释,代表返回值
>>=1 就是 //=2


"->"还会强制转换输出类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 18:31:50 | 显示全部楼层
_2_ 发表于 2020-5-7 18:30
"->"还会强制转换输出类型

胡说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 18:38:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表