[Python] Re: prime | 我看懂了!!! →→→→→进入此内容的聊天室

来自 4n0n4me, 2023-01-15, 写在 Python, 查看 80 次. 这张便签是回复 prime 来自 baba - 对比版本
URL http://www.code666.cn/view/05c05fcc
  1. import math
  2. 分解结果 = dict()
  3. 已知素数 = [2, 3]
  4. 当前素数序号 = 0
  5.  
  6.  
  7. def getPrime(待分解数: int) -> str:
  8.     global 分解结果, 已知素数, 当前素数序号
  9.     assert isinstance(待分解数, int)
  10.     assert 待分解数 > 1
  11.  
  12.     def 判断素数(_判断所用因数们: list, _待判断数: int):
  13.         _待判断数平方根 = math.floor(math.sqrt(_待判断数))
  14.         for _当前因数 in _判断所用因数们:
  15.             if _待判断数 % _当前因数 == 0:
  16.                 return False  # 不是素数
  17.             elif _当前因数 > _待判断数平方根:
  18.                 return True  # 是素数
  19.  
  20.     def 更新素数表():
  21.         _下一个素数 = 已知素数[-1]+2
  22.         while not 判断素数(已知素数, _下一个素数):
  23.             _下一个素数 += 2
  24.         已知素数.append(_下一个素数)
  25.         return
  26.  
  27.     def 递归处理(待分解因数: int) -> None:  # **这一次**待分解的数字
  28.         global 当前素数序号
  29.         待分解因数平方根 = math.floor(math.sqrt(待分解因数))  # 待分解的数字的平方根
  30.         当前素数 = 已知素数[当前素数序号]  # 取一个素数
  31.  
  32.         print(f'{待分解因数}分解开始')
  33.         print(f'当前素数:{当前素数}')
  34.  
  35.         if 待分解因数 == 1:  # 乘以一不用写了,乘不乘没区别
  36.             print(f'当前无需分解,分解结果:{分解结果}')
  37.             return
  38.  
  39.         # (*)
  40.         if 待分解因数 == 当前素数:  # 待分解的数就是这次的素数,直接算进去
  41.             print(f'{待分解因数}就是当前素数,加入分解结果')
  42.             if 待分解因数 in 分解结果:
  43.                 分解结果[待分解因数] += 1
  44.             else:
  45.                 分解结果.update({待分解因数: 1})
  46.  
  47.             return
  48.  
  49.         if not 待分解因数 % 当前素数:
  50.             print(f'可以直接用{当前素数}分解{待分解因数}进行递归')
  51.         else:
  52.             print(f'更新素数以后才能找到分解{待分解因数}的方法或者确定它是素数')
  53.  
  54.         while 待分解因数 % 当前素数:  # 待分解的数字不能被当前素数整除
  55.  
  56.             # 如果某因数在待分解数中的指数大于一
  57.             # 当待分解数从最小的素数开始分解
  58.             # 会先除到剩下某因数的N次方的倍数
  59.             # 当某因数以下的素数都被分解出去了
  60.             # 某因数成为最小的素数
  61.             # 因此当前素数会一直走到某因数
  62.             # 此时不满足循坏条件,直接退出循环,进行递归处理。
  63.             # 然后这个递归处理会分别处理某因数,和某因数的N-1次方的倍数
  64.             # 而此时当前素数已经走到某因数了!
  65.             # 因此,指数大于一的因数不会再(#)被加入!!!
  66.  
  67.             if 当前素数 > 待分解因数平方根:  # (#)
  68.                 print(f'当前素数大于待分解因数平方根,{待分解因数}直接加入分解结果')
  69.                 # 待分解因数不能被此前的任何素数整除
  70.                 # 甚至此时当前素数也没有走到待分解因数
  71.                 # 因此待分解因数此前没有被从(*)加入
  72.  
  73.                 # 而当前素数没有走到待分解因数,就说明递归处理中没有处理过“待分解因数的平方的倍数”
  74.                 # 就说明待分解因数在待分解数中的指数为一
  75.  
  76.                 分解结果.update({待分解因数: 1})
  77.                 return
  78.             else:
  79.                 # 取一个新的素数
  80.                 当前素数序号 += 1
  81.                 if 当前素数序号 == len(已知素数):
  82.                     更新素数表()
  83.                 当前素数 = 已知素数[当前素数序号]
  84.                 print(f'更新当前素数:{当前素数}')
  85.  
  86.         递归处理(当前素数)  # 递归处理的就是当前素数,所以直接在(*)加入,后面的操作都不会进行
  87.         递归处理(待分解因数//当前素数)  # 接着分,最后就是把最后一个(最大的一个)素因数分解出去以后这边就是1,然后这个函数就该一层层return出去了
  88.  
  89.         print(f'{待分解因数}分解完毕')
  90.  
  91.     递归处理(待分解数)
  92.  
  93.     res = f'{待分解数}={"*".join([f"{k}^{v}^" for k, v in 分解结果.items()])}'
  94.     res = res.replace('*', '\\*').replace('^1^', '')
  95.     分解结果.clear()
  96.     当前素数序号 = 0
  97.     return res
  98.  
  99.  
  100. print(getPrime(36))
  101.  

回复 Re: prime | 我看懂了!!! rss

标题 提交人 语言 时间
Re: Re: prime | 我看懂了!!! ee python 1 年 前.
Re: Re: prime | 我看懂了!!! ee python 1 年 前.

回复 "Re: prime | 我看懂了!!!"

这儿你可以回复上面这条便签

captcha