当前位置 : 主页 > 编程语言 > c语言 >

AcWing 867. 分解质因数

来源:互联网 收集:自由互联 发布时间:2023-08-25
题目 给定 $n$ 个正整数 $a_i$,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。 输入格式第一行包含整数 $n$。 接下来 $n$ 行,每行包含一个正整数

JWvFczgRNg.jpg

题目

给定 $n$ 个正整数 $a_i$,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式 第一行包含整数 $n$。

接下来 $n$ 行,每行包含一个正整数 $a_i$。

输出格式 对于每个正整数 $a_i$,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

每个正整数的质因数全部输出完毕后,输出一个空行。

数据范围 $1≤n≤100,2≤a_i≤2×10^9$ 输入样例:

2
6
8

输出样例:

2 1
3 1

2 3

思路

质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。

对于一个正整数而言,大于 $sqrt(n)$ 仅能有一个,所以我们可以遍历 $2-sqrt(n)$,每个数值除尽 $n$,此时当前数值就是一个质因数。 循环结束后,若 $n > 1$ 则证明最后一个质因数是 $n$

本题本质还是试除法,不过时间复杂度不再固定,时间复杂度 $O(logn)-O(sqrt(n))$

代码

#include <iostream>

using namespace std;

int n;

int main()
{
    cin >> n;
    
    while (n -- )
    {
        int a;
        cin >> a;
        for (int i = 2; i <= a / i; i ++ )
        {
            if (a % i == 0)
            {
                int s = 0;
                while (a % i == 0) a /= i, s ++ ;
                
                cout << i << " " << s << endl;
            }
        }
        if (a > 1) cout << a << " " << 1 << endl;
        cout << endl;
    }
    
    return 0;
}
上一篇:Programming abstractions in C阅读笔记:p123-p126
下一篇:没有了
网友评论