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

题意:

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值