质因数分解问题 --python

文章介绍了两种方法来解决寻找正整数n由两个不同质数相乘得到的情况下,较大质数的问题。第一种是常规的从大到小遍历判断质数的方法,但可能在处理大数据时效率低下。第二种方法通过分解质因数并排序来提高效率,降低了时间复杂度。
摘要由CSDN通过智能技术生成

原题来自洛谷计算生态P1075 [NOIP2012 普及组] 质因数分解【深基4.习8】求三角形 - 洛谷,原题如下:

题目描述

已知正整数 nn 是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入格式

输入一个正整数 nn。

输出格式

输出一个正整数 pp,即较大的那个质数。

输入输出样例

输入 #1        输出 #1

21            7

说明/提示

1≤n≤2×1091≤n≤2×109

这里提出以下两种解法:

1,常规解法

2,对输入的nums分解质因数

        先来说说第一种常规的解法,我们可以先设计一个函数,用于获取质数,代码如下:

import math
def zhishu(nums):
    temp = int(math.sqrt((nums))) + 1
    for i in range(2,temp):
        if nums % i == 0:
            return False
    else:
        return True

此函数用于判断是否是质数,接下来,由于题目要求最大的质数,我们可以选择设计循环,从输入向前循环,并依次判断每个数是否是质数,只要发现一个质数,则该质数就是要求的最大的质数,代码如下:

def get_max(nums):
    for i in range(nums,0,-1):
        if nums % i == 0 and (i % 6 == 1 or i % 6 == 5 or i == 2 or i == 3):
            return i

完整的代码如下:

import math
def zhishu(nums):
    temp = int(math.sqrt((nums))) + 1
    for i in range(2,temp):
        if nums % i == 0:
            return False
    else:
        return True

def get_max(nums):
    for i in range(nums,0,-1):
        if nums % i == 0 and (i % 6 == 1 or i % 6 == 5 or i == 2 or i == 3):
            return i
if __name__=="__main__":
    nums = int(input())
    print(get_max(nums))

这个方法固然没有错,但是碰上规模大一点的数据需要遍历时,由于采用的是从后向前的策略,所需时间将会消耗很大,很容易超时,因此提出以下方法以解决时间复杂度高的问题:

2,优先分解质因数

由于给定的数据是几个质因数的乘积,我们可以先考虑求解出该输入的所有因数,根据质数判断的方法,我们可以知道,如果需要求解输入的所有因数,只需要设计终止条件为temp = int(math.sqrt(nums)) + 1循环,定义集合用于存储nums % i == 0条件下的 i 和 nums // i ,这就代表了输入的两个因数,最后对该集合逆序排序,并将参数传入质数判断函数中,只要获取到质数就返回

代码如下:

import math
def zhishu(nums):
    temp = int(math.sqrt((nums))) + 1
    for i in range(2,temp):
        if nums % i == 0:
            return False
    else:
        return True

def get_max(nums):
    yin =set()
    temp = int(math.sqrt(nums))+1
    for i in range(2,temp):
        if nums % i == 0:
            yin.add(i)
            yin.add(nums//i)
    yin = sorted(yin,reverse = True)
    for i in yin:
        if zhishu(i):
            return i
    
if __name__=="__main__":
    nums = int(input())
    print(get_max(nums))

以上就是全部内容,如有错误欢迎评论区指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值