从 2 试除到整数平方根,找到较小质因数后用 n 除以它得到较大质数。
OJ: luogu
题目 ID: P1075
难度:入门
标签:数论枚举python
创建: 2026-06-18 22:06
更新: 2026-10-07 10:45
后置题目
roj 1626「一本通 6.3 例 2」Hankson 的趣味题B 的 divisors 函数沿用 A 教过的试除上界 sqrt(n) 来分解 b1,再在其上叠加 x|b1 收缩与因数表扩展roj 1154亲和数B 的 sigma(n) 直接复用 A 教的因子成对、小因子不超过 sqrt(n) 的观察,把只枚举 sqrt(n) 一侧的试除扩成求全部真因子和shumeng CSP202312B因子化简B 复用 A 的「从 2 开始逐个试除到根号分解质因子」这一步,只是扩展到统计每个质因子的指数并按阈值 k 取舍,外加除尽后剩余大质因子的兜底处理luogu P1029[NOIP 2001 普及组] 最大公约数和最小公倍数问题B 的正式做法复用 A 教的「从 2 试除到 sqrt(n) 分解质因子」这一步来数不同质因子个数 k,再叠加 gcd/lcm 换元 P=x0·a、质因子块去向得 2^k 的组合论证。
题意
已知正整数 n 恰好是两个不同质数的乘积,要求输出这两个质数中较大的那个。
思路
如果 d 是 n 的一个因子,那么 n // d 也是另一个因子。两个因子一定一小一大,小的那个不会超过 sqrt(n)。
题目保证 n = p * q,且 p、q 是不同质数。我们从 2 开始向上试除,遇到第一个能整除 n 的 d,它就是较小的质因数,于是较大的质数就是:
text
n // d旧目录中保留了 C++ 暴力枚举版本;Python 教学版使用 math.isqrt 控制试除上界,不新增 brute.py。
Python 知识
/home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:用int(input())读取单个整数。/home/rainboy/mycode/hugo-blog/content/program_language/python/math_tools.md:math.isqrt(n)返回整数平方根,适合做试除上界。range(2, isqrt(n) + 1)覆盖从2到sqrt(n)的所有可能小因子。n // d是整数除法,表示另一个质因数。
代码
python
from math import isqrt
n = int(input())
for d in range(2, isqrt(n) + 1):
if n % d == 0:
print(n // d)
breakPythonic 写法
试除质因数:
python
n=int(input())
i=2
while i*i<=n:
if n%i==0:
print(n//i); break
i+=1
else:
print(1)复杂度
最多试除到
总结
这题利用了题目给出的强条件:n 只有两个不同质因数。找到较小的那个,较大的答案就直接由除法得到。