12.质因子分解优化重难点剖析
①什么是质因子?
答:Eg:6=2 * 3 180=2 * 2 * 3 * 3 * 5 将一个数分解成各个因子的乘积形式
②思路:
1.比如求n的质因子,所以至少要打出1-n之间的质数表,以便使用;
这里贴上写过的:素数判断及打印素数表-优化版
2.由于每个质因子都可以不止出现一次,因此不妨定义结构体factor,用来存放质因子及其个数,如下所示:
struct factor{
int x,cnt;//x为质因子,cnt为其个数
}fac[10];
fac[10]数组存放的就是给定的正整数n的所有质因子。例如对180来说,fac数组如下:
fac[0],x=2;
fac[0].cnt=2;//相当于2*2
fac[1].x=3;
fac[1].cnt=2;//相当于3*3
fac[2].x=5;
fac[2].cnt=1;//相当于5*1
3.枚举1~sqrt(n)范围内的所有质因子p,判断p是否是n的因子。
·如果p是n的因子,那么给fac数组中增加质因子p,并初始化其个数为0。然后,只要p还是n的因子,就让n不断除以p,每次操作令p的个数加1,直到p不再是n的因子为止。
if(qt%a[i]==0) //qt是输入的数
{
yin[num].x=a[i];
yin[num].cn=0;
while(qt%a[i]==0)
{
yin[num].cn++;
qt/=a[i];
}
num++;
}
4.如果在上面步骤结束后n仍然大于1,说明n有且仅有一个大于sqrt(n)的质因子(有可能是n本身),这时需要把这个质因子加入fac数组,并令其个数为1。
if(qt!=1)
{
yin[num].x=qt;
yin[num++].cn=1;
}
完整代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000001;//这里是求1-1000001间的素数表
int a[maxn],cn=0;//cn计数素数的多少 同时为存放素数的数组a当成下标使用
bool p[maxn]={false}; //p数组元素flase表示为素数 true表示非素数
void findprime(int n) //形参n
{
for(int i=2;i<maxn;i++)
{
if(p[i]==false)
{
a[cn++]=i;
if(i>=n) break;//若i>n跳出
for(int j=i+i;j<maxn;j=j+i)
{
p[j]=true; //将a中的素数的所有倍数定义为非素数
}
}
}
}
struct fa{
int x,cn;
};
int main()
{
fa yin[10];
int qt,num=0;
cin>>qt;
findprime(qt); //打印1-qt间的质数
if(qt==1) cout<<"1=1";
else
{
cout<<qt<<"=";
for(int i=0;i<cn&&a[i]<=(int)sqrt(qt*1.0);i++)
{
if(qt%a[i]==0)
{
yin[num].x=a[i];
yin[num].cn=0;
while(qt%a[i]==0)
{
yin[num].cn++;
qt/=a[i];
}
num++;
}
if(qt==1) break;
}
if(qt!=1)
{
yin[num].x=qt;
yin[num++].cn=1;
}
for(int i=0;i<num;i++)
{
if(i>0) cout<<"*";
cout<<yin[i].x;
if(yin[i].cn>1) cout<<"^"<<yin[i].cn;
}
}
return 0;
}