鱼C论坛

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

[已解决]分解质因数

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

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


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

这是我现在的代码:

  1. zhishu = []
  2. def zs(g):
  3.     for z in range(2,g):
  4.         if num%z == 0:
  5.             d = True
  6.             break
  7.         else:
  8.             d = False
  9.     if d:
  10.         zhishu.append(g)
  11.     else:
  12.         zys(g)

  13. def zys(n):
  14.     for yinshu in range(2,n):
  15.         if num%yinshu == 0:
  16.             zs(yinshu)
  17.         else:
  18.             zys(v)

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

  21. v = num
  22. zys(v)
  23. print(zhishu)
复制代码


我感觉是zys这个函数有些问题,求大佬指点
最佳答案
2020-4-24 22:49:01
最直接(暴力)的思路:
例如
求20的质因数,找到2并存储2,然后20除找到的质因数(2)等于10。
求10的质因数,找到2并存储2,然后10除找到的质因数(2)等于5。
求5的质因数...循环上述步骤

  1. def zys(num):                                           #求质因数
  2.     while num > 1:
  3.         for yinshu in range(2,num+1):
  4.             if num % yinshu == 0:
  5.                 zhiyinshu.append(yinshu)
  6.                 break
  7.         num //= yinshu

  8. def show_zys():                                         #显示质因数
  9.     print(str(num) + ' = ', end = '')
  10.     for i in range(len(zhiyinshu)):
  11.         if i != len(zhiyinshu) - 1:
  12.             print(str(zhiyinshu[i]) + '×', end = '')
  13.         else:
  14.             print(zhiyinshu[i])
  15.         
  16. zhiyinshu = []
  17. num = int(input('请输入一个数字:'))
  18. zys(num)
  19. show_zys()
复制代码


结果
  1. 请输入一个数字:20
  2. 20 = 2×2×5
复制代码
  1. 请输入一个数字:23
  2. 23 = 23
复制代码

最佳答案

查看完整内容

最直接(暴力)的思路: 例如 求20的质因数,找到2并存储2,然后20除找到的质因数(2)等于10。 求10的质因数,找到2并存储2,然后10除找到的质因数(2)等于5。 求5的质因数...循环上述步骤 结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-24 22:49:01 | 显示全部楼层    本楼为最佳答案   
最直接(暴力)的思路:
例如
求20的质因数,找到2并存储2,然后20除找到的质因数(2)等于10。
求10的质因数,找到2并存储2,然后10除找到的质因数(2)等于5。
求5的质因数...循环上述步骤

  1. def zys(num):                                           #求质因数
  2.     while num > 1:
  3.         for yinshu in range(2,num+1):
  4.             if num % yinshu == 0:
  5.                 zhiyinshu.append(yinshu)
  6.                 break
  7.         num //= yinshu

  8. def show_zys():                                         #显示质因数
  9.     print(str(num) + ' = ', end = '')
  10.     for i in range(len(zhiyinshu)):
  11.         if i != len(zhiyinshu) - 1:
  12.             print(str(zhiyinshu[i]) + '×', end = '')
  13.         else:
  14.             print(zhiyinshu[i])
  15.         
  16. zhiyinshu = []
  17. num = int(input('请输入一个数字:'))
  18. zys(num)
  19. show_zys()
复制代码


结果
  1. 请输入一个数字:20
  2. 20 = 2×2×5
复制代码
  1. 请输入一个数字:23
  2. 23 = 23
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  8.         elif yin == [] and yinshu == n:
  9.                 print('此为质数')
  10.     if yin != []:
  11.         for each in yin :
  12.             print(each)

  13. print('\n---------------------------分解质因数---------------------------\n')
  14. num = int(input('请输入一个数字:'))
  15. zys(num)
复制代码

想说,只需要一个函数就能解决的问题,没必要搞的太复杂,可以先写一下思维导图或具体思路吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  4.         while not n&1:
  5.             n>>=1
  6.             res.append(2)
  7.         
  8.         temp=3
  9.         maximum=floor(sqrt(n))

  10.         while temp<=maximum:
  11.             if not n%temp:
  12.                 while not n%temp:
  13.                     n//=temp
  14.                     res.append(temp)

  15.                 maximum=floor(sqrt(n))

  16.             temp+=2

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

  19.         return res
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 10:01:38 | 显示全部楼层
  1. num = int(input("请输入一个合数:"))
  2. n = num
  3. list1 = []  #存放质因数
  4. for j in range(int(n/2)+1):
  5.     for i in range(2,n):
  6.         if num % i == 0:  #可以整除
  7.             list1.append(i)
  8.             num = num // i
  9.             break
  10. if len(list1) == 0:
  11.     print("此数是是质数,请重新输入另一个数")
  12.     exit()
  13. #print(list1)
  14. print('%d = '%(n),end='')
  15. for i in range(len(list1)):
  16.     if i  == len(list1)-1:
  17.         print('%s' % (list1[i]))
  18.     else:
  19.         print('%s * ' % (list1[i]),end='')
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

你说的第4点不对,那叫递归。
小甲鱼最新课程 -> https://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 感谢大佬

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

你这个好像不对啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

-> 是语法么?
还有这个 >>=
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本来这个函数判断输入是否为质数,不是的话返回一个包含其因数的列表
看了一下最佳答案是要求返回的所有数都是质数
emmm这也不难
  1. def resolve(x):
  2.     try:
  3.         assert x > 1
  4.         zhi = []
  5.         z = x
  6.         while x > 1:
  7.             for each in range(2,x+1):
  8.                 if x % each == 0 :
  9.                     zhi.append(each)
  10.                     x = x // each
  11.                     break            
  12.         if len(zhi) > 1 :
  13.             h =''
  14.             for each in zhi:
  15.                 h += ' '+str(each)+' '+'*'
  16.             h = h[:len(h)-1] + '='+' '+str(z)
  17.             return h
  18.         else:
  19.             return'此为质数'
  20.     except AssertionError:
  21.         return'请不要输入不正确的数'
  22.         
  23. x = int(input('请输入大于1的整数:'))
  24. y = resolve(x)
  25. print(y)
复制代码

结果如下
  1. 请输入大于1的整数:11
  2. 此为质数
复制代码
  1. 请输入大于1的整数:12
  2. 2 * 2 * 3 = 12
复制代码
  1. 请输入大于1的整数:0
  2. 请不要输入不正确的数
复制代码

要是没有bug就不用回我了,就酱紫
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

-> 是语法么?

-> 是注释,代表返回值
>>=1 就是 //=2
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

我们小学没要求这个
小甲鱼最新课程 -> https://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])
最佳答案的第二部分没看懂啊,有大佬能分步详细解释下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


"->"还会强制转换输出类型
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

胡说
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 18:38:33 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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