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; // 程序正常结束
}

总结

  1. 能满足 x%i==0i 必为质数:因为合数的最小质因子已经被提前除净,x 不可能被合数整除;
  2. 核心操作是 while (x%i==0) x/=i:除净当前因子,筛掉后续所有含该因子的合数;
  3. 枚举到 √x 即可:剩余大于 √x 的部分若 > 1,本身就是最后一个质因子。
posted @ 2026-04-09 11:14  CodeMagicianT  阅读(3)  评论(0)    收藏  举报