分解质因数

线性_数组存储

int pri[maxn],inp[maxn];
void prime(long long n)
{
	for (int i=2;i<=n;i++)
	{
		if (!inp[i]) pri[++pri[0]]=i;
		for (int j=1;j<=pri[0] && i*pri[j]<=n;j++)
		{
			inp[i*pri[j]]=1;
			if (!i%pri[j]) break;
		}
	}
}
int fu[maxn],tot,mi[maxn];
void func(long long n)
{
	for (int i=2;i<=pri[0];i++)
	{
		if (!n%i)
		{
			fu[++tot]=i;
			while (!n%i) mi[tot]++,n/=i;
		}
	}
	if (n>1) fu[++tot]=i,mi[tot]=1;
}

bf找法

#include<bits/stdc++.h>
using namespace std;
void func(int n)
{
	for (int i=2;i*i<=n;i++)
	{
		if (n%i == 0)
		{
			cout << "质因数有:" << i << " ";
			int cnt=0;
			while(n%i == 0)
			{
				cnt++;
				n/=i;
			}
			cout << "其指数是:" << cnt << endl;
		}
	}
	if (n>1) cout << "质因数有:" << n << " " << "其指数是:" << 1 << endl;
}
int main()
{
	int n;
	cin >> n;
	func(n);
	return 0;
}

线性筛做法

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e6+10;
int prime[maxn];
bool is_no_p[maxn]={1,1};
void Prime(int n)
{
	for (int i=2;i<=n;i++)
	{
		if (!is_no_p[i]) prime[++prime[0]]=i;
		for (int j=1;j<=prime[0] && i*prime[j]<=n;j++)
		{
			is_no_p[i*prime[j]]=1;
			if (i%prime[j] == 0) break;
		}
	}
}
void func(int n)
{
	for (int i=2;i<=prime[0];i++)
	{
		if (n%i == 0)
		{
			cout << "质因数有:" << i << " ";
			int cnt=0;
			while(n%i == 0)
			{
				cnt++;
				n/=i;
			}
			cout << "其指数是:" << cnt << endl;
		}
	}
	if (n>1) cout << "质因数有:" << n << " " << "其指数是:" << 1 << endl;
}
int main()
{
	int n;
	cin >> n;
	Prime(n);
	func(n);
	return 0;
}
posted @ 2026-04-11 15:23  msjing  阅读(5)  评论(0)    收藏  举报