WangJS 发表于 2020-4-24 22:49:00

分解质因数

大佬们,我正在写一个分解质因数的代码,我把自己都写蒙了

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



这是我现在的代码:

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) + '×', end = '')
      else:
            print(zhiyinshu)
      
zhiyinshu = []
num = int(input('请输入一个数字:'))
zys(num)
show_zys()

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

沐羽尘 发表于 2020-4-24 23:47:58

yin = []
            
def zys(n):
    for yinshu in range(2,n+1):
      if n % yinshu == 0 andyinshu != 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)

想说,只需要一个函数就能解决的问题,没必要搞的太复杂,可以先写一下思维导图或具体思路吧

永恒的蓝色梦想 发表于 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

冰河星云 发表于 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))
    else:
      print('%s * ' % (list1),end='')

qiuyouzhi 发表于 2020-4-25 10:32:41

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

你说的第4点不对,那叫递归。

熊顺祥 发表于 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))

               

WangJS 发表于 2020-4-25 10:55:29

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

你这个好像不对啊{:10_297:}

WangJS 发表于 2020-4-25 10:57:41

永恒的蓝色梦想 发表于 2020-4-25 07:22


第一行和第六行的语法我都不明白啊{:10_266:}

-> 是语法么?
还有这个 >>=

沐羽尘 发表于 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就不用回我了,就酱紫

TJBEST 发表于 2020-4-25 17:51:08

质因数 返回的不是 质数和幂次吗? 比如9 写作3^2 那么返回3 3不符合质因数分解要求,质因数分解要求 每个质数只出现一次,幂次可以不是1
比如 20 = (2^2)x(5^1)这个才是质因数分解的结果

永恒的蓝色梦想 发表于 2020-4-25 18:08:47

WangJS 发表于 2020-4-25 10:57
第一行和第六行的语法我都不明白啊

-> 是语法么?


-> 是注释,代表返回值
>>=1 就是 //=2

WangJS 发表于 2020-4-25 18:25:47

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

我们小学没要求这个{:10_250:}

luxhalo 发表于 2020-4-27 17:42:59

for i in range(len(zhiyinshu)):
      if i != len(zhiyinshu) - 1:
            print(str(zhiyinshu) + '×', end = '')
      else:
            print(zhiyinshu)
最佳答案的第二部分没看懂啊,有大佬能分步详细解释下吗

_2_ 发表于 2020-5-7 18:30:55

永恒的蓝色梦想 发表于 2020-4-25 18:08
-> 是注释,代表返回值
>>=1 就是 //=2

"->"还会强制转换输出类型

永恒的蓝色梦想 发表于 2020-5-7 18:31:50

_2_ 发表于 2020-5-7 18:30
"->"还会强制转换输出类型

胡说

_2_ 发表于 2020-5-7 18:38:33

永恒的蓝色梦想 发表于 2020-5-7 18:31
胡说

……当我没说
页: [1]
查看完整版本: 分解质因数