Acwing867. 分解质因数

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

输入格式

第一行包含整数 n。

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

输出格式

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

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

数据范围

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

输入样例:

2
6
8

输出样例:

2 1
3 1

2 3
#include 
#include 
#include 

using namespace std;

int main()
{
    int n; 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;    
}

这里有个性质:n中最多只含有一个大于sqrt(n)的因子。证明通过反证法:如果有两个大于sqrt(n)的因子,那么相乘会大于n,矛盾。证毕
于是我们发现最多只有一个大于sqrt(n)的因子,对其进行优化。先考虑比sqrt(n)小的,代码和质数的判定类似
最后如果n还是>1,说明这就是大于sqrt(n)的唯一质因子,输出即可。 

 

你可能感兴趣的:(算法基础课,算法,算法,c++,开发语言,蓝桥杯,质数)