赞
踩
题意:
给出一个int范围的整数,按照从小到大的顺序输出 其分解为质因数的乘法算式
输入格式:
97532468
输出格式:
97532468=2^2*11*17*101*1291
思路:
先判断质数、再打印分解后的质因数表、最后按格式输出
完整代码:
- import math
- n = int(input())
-
-
- def isPrime(x):
- if x <= 3:
- return x >= 2
- else:
- if (x+1) % 6 != 0 and (x-1) % 6 != 0:
- return False
-
- for i in range(2,int(math.sqrt(x))+1):
- if x % i == 0:
- return False
- return True
-
- def factor(n):
- if n == 1:
- return [1]
- ans = []
- if isPrime(n): # 判断本身是否是质数
- ans.append(n)
- return ans
- primes = [i for i in range(2, 10) if isPrime(i)] # 生成待循环整除的质数列表
-
- i = 0
- while not isPrime(n):
- if n % primes[i] == 0:
- ans.append(primes[i])
- n //= primes[i]
- i = 0
- else:
- i += 1
- if i >= len(primes)-1:
- primes += [i for i in range(i+1,i+1000) if isPrime(i)]
- ans.append(n) # 保存n,由于while循环判断,此时n是最后一个质数
- return ans
-
- k = factor(n)
- str1 = f'{n}='
- for i in k:
- if k.count(i) > 1:
- str1 += f'{i}^{k.count(i)}*'
- k = list(filter(lambda x:x!=i,k))
- elif k.count(i) == 1:
- str1 += f'{i}*'
- str1 = str1.strip('*')
- print(str1)
代码大致分为三部分,拆解一下:
1.判断质数
- def isPrime(x):
- if x <= 3:
- return x >= 2 # 如果是2、3, 返回True
- else:
- if (x+1) % 6 != 0 and (x-1) % 6 != 0:
- return False
-
- for i in range(2,int(math.sqrt(x))+1):
- if x % i == 0:
- return False
- return True
2.打印分解后的质因数列表
- def factor(n):
- if n == 1: # 因为1不是质数,当输入n为1时,输出1
- return [1]
- ans = []
- if isPrime(n): # 判断本身是否是质数
- ans.append(n)
- return ans
- primes = [i for i in range(2, 10) if isPrime(i)] # 生成待循环整除的质数列表
-
- i = 0
- while not isPrime(n):
- if n % primes[i] == 0:
- ans.append(primes[i]) # 保存质因子到列表中
- n //= primes[i]
- i = 0 # 重置质数列表下标(重新从2,3,5...开始判断整除)
- else:
- i += 1 # 如果不能整除,则下标后移,判断下一个质数是否能整除
- if i >= len(primes)-1:
- # 如果质数列表的长度不够,就扩充一部分,如果遇到数组超限,就加大1000这个判断区间值
- primes += [i for i in range(i+1,i+1000) if isPrime(i)]
- ans.append(n) # 保存n,由于while循环判断,此时n是最后一个质数
- return ans
3.按格式要求输出
- k = factor(n) # 此时k=ans=分解后的质因数列表,比如k=[2,2,3,3,5]
- str1 = f'{n}=' # 先把输入的数赋给str1,比如输入n为180,此时str1: 180=
- for i in k:
- if k.count(i) > 1: # 如果质因数列表出现相同的数,比如两个2
- str1 += f'{i}^{k.count(i)}*' # 输出为幂的形式,比如2的2次方
- k = list(filter(lambda x:x!=i,k)) #对原列表筛选一下,去掉和i相同的元素,比如去掉所有的2
- elif k.count(i) == 1:
- str1 += f'{i}*'
- str1 = str1.strip('*') # 去掉最后一个乘号
- print(str1)
输入180:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。