56.Acwing基础课第867题-简单-分解质因数
56.Acwing基础课第867题-简单-分解质因数
题目描述
给定 \(n\) 个正整数 \(a_i\),将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。
输入格式
第一行包含整数 \(n\)。
接下来 \(n\) 行,每行包含一个正整数\(a_i\)。
输出格式
对于每个正整数\(a_i\),按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。
每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围
1≤n≤100
2≤\(a_i\)≤2×109
输入样例:
2
6
8
输出样例:
2 1
3 1
2 3
代码:
// 包含标准输入输出头文件(cin/cout依赖)
#include <iostream>
// 算法库(本代码未直接使用,属于通用模板保留)
#include <algorithm>
// 使用std命名空间,避免重复写std::
using namespace std;
// 质因数分解核心函数:将正整数x分解为质因数乘积,并输出每个质因数及其指数
// 例如:x=280 → 输出 2 3 \n 5 1 \n 7 1 \n(表示280=2³×5¹×7¹)
void divide(int x)
{
// 枚举2到√x的所有数(i <= x/i 等价于 i <= sqrt(x),避免浮点运算精度误差)
// 依据:n中最多只有一个大于√n的质因子,因此只需枚举到√x即可
for (int i = 2; i <= x / i; i ++ )
// 若i是x的质因子(能整除x)
if (x % i == 0)
{
int s = 0; // s:统计当前质因子i的指数(出现次数)
// 循环除净x中所有的质因子i,同时统计指数
while (x % i == 0)
{
x /= i; // 把x中的i除干净
s ++ ; // 指数+1
}
// 输出质因子i及其指数s
cout << i << ' ' << s << endl;
}
// 若循环结束后x>1,说明剩下的x本身是一个大于√原数的质因子(指数为1)
// 例如:x=15,枚举到i=2(不整除)、i=3(整除,x变为5),循环结束后x=5>1,输出5 1
if (x > 1) cout << x << ' ' << 1 << endl;
// 每组测试用例分解完成后输出空行,分隔不同输入的结果
cout << endl;
}
int main()
{
int n; // n:测试用例的组数
cin >> n; // 输入测试用例组数
// 循环处理n组测试用例
while (n -- )
{
int x; // x:当前需要分解质因数的正整数
cin >> x; // 输入待分解的数
divide(x); // 调用分解函数处理x
}
return 0; // 程序正常结束
}
总结
- 能满足
x%i==0的i必为质数:因为合数的最小质因子已经被提前除净,x 不可能被合数整除; - 核心操作是
while (x%i==0) x/=i:除净当前因子,筛掉后续所有含该因子的合数; - 枚举到
√x即可:剩余大于√x的部分若 > 1,本身就是最后一个质因子。

浙公网安备 33010602011771号