题意:
给出一个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: