1 条题解
-
0
思路
题目保证 n 恰好是两个质数的乘积(n = p × q,p ≤ q)。这大大简化了问题:我们只要从 2 开始往上找,找到第一个能整除 n 的数,那它必然是较小的质因数 p,较大的那个就是 n / p。
为什么第一个找到的因数一定是质数?因为如果它是合数,它的质因数更小、也会整除 n,早就被先找到了。
为什么找到 p 后不用再往下找?因为 n 只有两个质因数,
n / p就是答案 q 本身,不需要再分解。从 2 试到 √n 就够了:p ≤ q 意味着 p × p ≤ p × q = n,所以 p 不超过 √n(√(2×10⁹) ≈ 44721,循环最多四万多次,非常快)。
代码
#include <stdio.h> int main() { long long n; // 2*10^9 已接近 int 上限,用 long long 更稳 scanf("%lld", &n); for (long long i = 2; i * i <= n; i++) { if (n % i == 0) { // 找到较小质因数 i printf("%lld\n", n / i); // 较大的就是 n / i return 0; } } return 0; }用样例走一遍
n = 15:
- i = 2:15 % 2 = 1,不行;
- i = 3:15 % 3 = 0!输出 15 / 3 = 5。✓
再看 n = 6:
- i = 2:6 % 2 = 0,输出 6 / 2 = 3。
易错点
- n 最大约 2×10⁹,已经贴近 int 上限(2147483647)。用
int读入虽勉强够,但i * i中间计算容易溢出,建议全程long long,格式符用%lld。 - 循环条件写
i * i <= n而不是i <= sqrt(n):sqrt是浮点运算,对大数可能有误差,导致差 1 的判断错误。 - 不需要判质数!题目保证只有两个质因数,找到第一个因数后
n / i自动就是质数。写一个isPrime再逐个验证是多余的。 - 别循环到 n:那样最多要循环 20 亿次,会超时。√n 是关键。
信息
- ID
- 9
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者
吉公网安备22010402001496号