注意:质因子可能会大于sqrt(a) 但是这样的质因子如果存在就只有一个,可以利用这个性质优化代码
一些解释:可以结合代码理解
在分解过程中,1~i肯定不会再是k的质因子(这个k一直在不断更新)
k在不断更新,相当于每次都分解一个新的k,但是这个新的k肯定不会再有1~i范围内的质因子
所以i<=k/i这一条件一直适用,相当于一直再分解一个新的k,而这个新的k在1到i范围内没有质因子(或者说1~i内的质因子已经被分解了)
最后如果k>1 那么得到的就是大于sqrt(k)的一个质因子 但是当前的k可能已经不再是原先的k
如果当前的k还是原先的k,那么k必为质数,因为此时k在1~i范围内没有找到质因子。并且只有本身一个质因子
#include<bits/stdc++.h>
using namespace std;
int n,a;
void solve(int k)
{
if(k==1) printf("1 1\n");
for(int i=2;i<=k/i;i++)
{
int cnt=0;
while(k%i==0)
{
cnt++;
k/=i;//这个k一直在不断更新
}
if(cnt) printf("%d %d\n",i,cnt);
}
if(k>1) printf("%d 1\n",k);//最后如果k>1 那么得到的就是大于sqrt(k)的一个质因子 但是当前的k可能已经不再是原先的k
//如果当前的k还是原先的k,那么k必为质数,因为此时k在1~i范围内没有找到质因子。并且只有本身一个质因子
puts("");
}
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%d",&a);
solve(a);
}
}