想说的话
金九银十秋招马上就要来了,小编今天以洛谷面试入门" 质因数分解"(B2084)作为索引跟大家简单介绍一下质数这一个常考的笔试算法,以及相关的唯一分解定理。
话不多说,进入正文
老样子,我们先来看看题目,理解题目才是解题的关键
一、质因数分解(洛谷B2084)
题目描述
已知正整数 n n n 是两个不同的质数的乘积,试求出较大的那个质数。
输入格式
输入只有一行,包含一个正整数 n n n( 6 < n < 1 0 9 6<n<10^9 6<n<109)。
输出格式
输出只有一行,包含一个正整数 p p p,即较大的那个质数。
样例输入 #1
21
样例输出 #1
7
题目很简单你是否有秒解的思路了呢
题目主要考察的是我们对唯一分解定理的理解
你是否在想什么是唯一分解定理呢?别着急往下看
二、常规解题思路
题目意思是想让我们对输入的n(注意范围)进行分解成两个不相同的质数,这两个质数的乘积需要等于n,那么我们只需要从2到sqrt(n)进行循环判断这个数是不是质数,同时去判断n/i这个数是不是也是一个质数,最后输出 max(i, n / i) 或者直接输出 n / i。
(当然这个题目数据量不是很大,使用常规方法你也能顺利的通过这个题目,不会超时)
判断素数解法
#include <iostream>
#include <cmath>
using namespace std;
// 判断一个数是否是质数
bool isPrime(long long num) {
if (num <= 1) return false;
if (num <= 3) return true;
if (num % 2 == 0 || num % 3 == 0) return false;
for (long long i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
return true;
}
int main() {
long long n;
cin >> n;
// 从2开始尝试找到质因数
for (long long i = 2; i <= sqrt(n); ++i) {
if (n % i == 0) {
long long otherFactor = n / i;
// 判断i和otherFactor是否都是质数
if (isPrime(i) && isPrime(otherFactor)) {
cout << max(i, otherFactor) << endl;
return 0;
}
}
}
// 如果没有找到,说明n本身是质数,但题目保证n是两个不同质数的乘积
return 0;
}
三、最优解题思路
唯一分解定理的内容,简单来说就是一个正整数 n 是两个不同的质数的乘积,只有一组可能,因为质数的乘积是唯一的。
例如,如果 n = 21,它是 3 和 7 的乘积,且 3 和 7 都是质数。没有其他不同的质数对可以乘积得到 21。
所以第二种解法,并没有直接判断一个数是否是质数,而是通过寻找 n 的因数来间接判断。具体步骤如下:
1.从 2 开始尝试找到 n 的因数。
2.如果 i 是 n 的因数(即 n % i == 0),则 i 和 n / i 都是 n 的因数。
3.由于题目保证 n 是两个不同质数的乘积,所以找到的第一个因数 i 和 n / i 必然是质数。
唯一分解定理
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long n;
cin >> n;
// 从2开始尝试找到质因数
for (long long i = 2; i <= sqrt(n); ++i) {
if (n % i == 0) {
cout << n / i << endl; // 直接输出另一个质因数
return 0;
}
}
// 如果没有找到,说明n本身是质数,但题目保证n是两个不同质数的乘积
return 0;
}
总结
今天的分享就到这里啦,本文简单介绍了质数的定义和性质,并通过一个具体的题目讲解了如何分解一个数为两个不同质数的乘积。希望大家通过本文能够对质数和唯一分解定理有更深入的理解,并掌握相关的算法技巧!
喜欢小编博客的可以点赞支持哦,觉得内容对你有用的可以留下您的关注,也欢迎各位小伙伴在评论区交流。
最后,祝我们早日上岸,拿到心仪的offer![在这里插入图片描述]