原题来自洛谷计算生态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))
以上就是全部内容,如有错误欢迎评论区指正