线性_数组存储
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;
}