12.质因子分解优化重难点剖析

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;
}


发布了26 篇原创文章 · 获赞 26 · 访问量 3604

猜你喜欢

转载自blog.csdn.net/xg987599519/article/details/104055823