acwing 867. 分解质因数

题目描述

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

输入格式

第一行包含整数 n。

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

输出格式

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

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

数据范围

1≤n≤100
2≤ai≤2×109

输入样例:

2
6
8

输出样例:

2 1
3 1

2 3

试除法求解

分析

一开始我是想用先求出 2 ~ 2e9之间的素数表,然后根据素数表来求每个ai的质因子和指数的

但是开素数表的时候要开到 2*10^9 太大了,爆内存,所以这个方法行不通


下面的方法就比较巧妙

for(int i = 2; i <= x / i; i++) 列举了所有可能是x质因子的数,虽然里面可能有合数,但是由于每遇到一个质因子,就把该质因子的最大指数倍给除掉了,所以有合数并不影响

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

// const int N = 1e9 + 10;
// int prims[N];
// int cnt = 0;
// int st[N];

int main()
{
    int n;
    scanf("%d", &n);
    while(n --)
    {
        int x;
        scanf("%d", &x);
        
        for(int i = 2; i <= x / i; i++)
        {

            if(x % i == 0)  // 说明i是x的质因数,如果2是x的质因数,那么当i=4的时候一定不是此时x的因数,所以不必担心
            {
                int cnt = 0;
                while(x % i == 0)
                {
                    cnt ++;
                    x /= i;
                }
                printf("%d %d\n", i, cnt);
            }
        }
        if(x > 1) printf("%d 1\n", x, 1);
        puts("");
    }
    
    return 0;
}

时间复杂度

每组数据都是根号n

参考文章

posted @ 2022-02-25 15:15  VanHope  阅读(58)  评论(0编辑  收藏  举报