#include<bits/stdc++.h>
using namespace std;
/*
质因数分解
扫描2~sqrt(n)的每个数d,若d能整除n,则从n中除掉所有的因子d,同时累计出去d的个数
*/
void fj(int x)
{
for(int i=2;i<=x/i;i++) //为什么循环结束条件是i<=x/i?
{ //i<=x/i ==> i<=sqrt(x); 因为一个数x最多只会有一个大于sqrt(x)的因子
if(x%i==0)
{
printf("%d ",i); //为什么直接输出i,i一定是质数吗? 如果i是合数那么一定可以拆成几个小于i数之积但是i是从小到大循环,
int k=0; //所以x中小于i的约数已经被除尽了,两者相矛盾
while(x%i==0)
{
k++;
x/=i;
}
printf("%d\n",k);
}
}
if(x!=1) printf("%d %d\n",x,1); //查看有没有哪个大于sqrt(x)的因子
puts("");
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
fj(x);
}
return 0;
}
质因数分解
最新推荐文章于 2024-11-14 19:06:32 发布