当前位置:   article > 正文

PAT甲级1059 Prime Factors - python实现(25分)_python primefactors

python primefactors

题意:

给出一个int范围的整数,按照从小到大的顺序输出 其分解为质因数的乘法算式

输入格式:

97532468

输出格式:

97532468=2^2*11*17*101*1291

思路:

先判断质数、再打印分解后的质因数表、最后按格式输出

完整代码:

  1. import math
  2. n = int(input())
  3. def isPrime(x):
  4. if x <= 3:
  5. return x >= 2
  6. else:
  7. if (x+1) % 6 != 0 and (x-1) % 6 != 0:
  8. return False
  9. for i in range(2,int(math.sqrt(x))+1):
  10. if x % i == 0:
  11. return False
  12. return True
  13. def factor(n):
  14. if n == 1:
  15. return [1]
  16. ans = []
  17. if isPrime(n): # 判断本身是否是质数
  18. ans.append(n)
  19. return ans
  20. primes = [i for i in range(2, 10) if isPrime(i)] # 生成待循环整除的质数列表
  21. i = 0
  22. while not isPrime(n):
  23. if n % primes[i] == 0:
  24. ans.append(primes[i])
  25. n //= primes[i]
  26. i = 0
  27. else:
  28. i += 1
  29. if i >= len(primes)-1:
  30. primes += [i for i in range(i+1,i+1000) if isPrime(i)]
  31. ans.append(n) # 保存n,由于while循环判断,此时n是最后一个质数
  32. return ans
  33. k = factor(n)
  34. str1 = f'{n}='
  35. for i in k:
  36. if k.count(i) > 1:
  37. str1 += f'{i}^{k.count(i)}*'
  38. k = list(filter(lambda x:x!=i,k))
  39. elif k.count(i) == 1:
  40. str1 += f'{i}*'
  41. str1 = str1.strip('*')
  42. print(str1)

代码大致分为三部分,拆解一下:

1.判断质数

  1. def isPrime(x):
  2. if x <= 3:
  3. return x >= 2 # 如果是2、3, 返回True
  4. else:
  5. if (x+1) % 6 != 0 and (x-1) % 6 != 0:
  6. return False
  7. for i in range(2,int(math.sqrt(x))+1):
  8. if x % i == 0:
  9. return False
  10. return True

2.打印分解后的质因数列表

  1. def factor(n):
  2. if n == 1: # 因为1不是质数,当输入n为1时,输出1
  3. return [1]
  4. ans = []
  5. if isPrime(n): # 判断本身是否是质数
  6. ans.append(n)
  7. return ans
  8. primes = [i for i in range(2, 10) if isPrime(i)] # 生成待循环整除的质数列表
  9. i = 0
  10. while not isPrime(n):
  11. if n % primes[i] == 0:
  12. ans.append(primes[i]) # 保存质因子到列表中
  13. n //= primes[i]
  14. i = 0 # 重置质数列表下标(重新从2,3,5...开始判断整除)
  15. else:
  16. i += 1 # 如果不能整除,则下标后移,判断下一个质数是否能整除
  17. if i >= len(primes)-1:
  18. # 如果质数列表的长度不够,就扩充一部分,如果遇到数组超限,就加大1000这个判断区间值
  19. primes += [i for i in range(i+1,i+1000) if isPrime(i)]
  20. ans.append(n) # 保存n,由于while循环判断,此时n是最后一个质数
  21. return ans

3.按格式要求输出

  1. k = factor(n) # 此时k=ans=分解后的质因数列表,比如k=[2,2,3,3,5]
  2. str1 = f'{n}=' # 先把输入的数赋给str1,比如输入n为180,此时str1: 180=
  3. for i in k:
  4. if k.count(i) > 1: # 如果质因数列表出现相同的数,比如两个2
  5. str1 += f'{i}^{k.count(i)}*' # 输出为幂的形式,比如2的2次方
  6. k = list(filter(lambda x:x!=i,k)) #对原列表筛选一下,去掉和i相同的元素,比如去掉所有的2
  7. elif k.count(i) == 1:
  8. str1 += f'{i}*'
  9. str1 = str1.strip('*') # 去掉最后一个乘号
  10. print(str1)

输入180:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/632780
推荐阅读
相关标签
  

闽ICP备14008679号