试题 算法提高 分解质因数

2020蓝桥杯习题汇总

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  给定一个正整数n,尝试对其分解质因数
输入格式
  仅一行,一个正整数,表示待分解的质因数
输出格式
  仅一行,从小到大依次输出其质因数,相邻的数用空格隔开
样例输入
100
样例输出
2 2 5 5
数据规模和约定
  n<=2147483647


分析:
这道题是不难的,问题在于怎样避免超时,所以我们应该尽量优化我们的代码

  • 如果输入的数已经是质数了,那么可以直接输出,节省运行时间。
  • 如果不是质数,那么就从2开始求解质因数;假设这个数能被2整除,那我们应该直接利用循环一直除,直到该数不能被2整除,然后进行下一个数,直到循环结束。例如n=80,首先从2开始判断是否为80的质因数,很明显80能被2整除,那我们就一直除,直到不能被2整除,即80/2=40,40/2=20,20/2=10,10/2=5,此时n=5不能被2整除,而且3和4也不行,直接到5/5=1,此时循环结束。
  • 还有一个问题就是除尽某个质因数之后,要判断该数是否为质数,如果该数是质数,那么直接返回该数,这样子可以省下很多时间,避免超时。
  • 其次,在判断质数时,分为偶数和奇数,偶数情况下都不是质数,奇数情况下只需要判断到根号n+1的情况即可,并且步长为2,这样也减少了时间上的消耗。
def fun(n):
    # 判断质数
    if n < 2:
        return False
    elif n % 2 == 0:
        return False   
    for i in range(3,int(pow(n,0.5))+1,2):
        if n % i == 0:
            return False
    return True

n = int(input())
for i in range(2,n+1):
    if n % i == 0:
        while n % i == 0:
            print(i,end=' ')
            n //= i
    if fun(n):
        print(n,end=' ')
        break
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值