质因数分解
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 1005
using namespace std;
int p[maxn],c[maxn],tot;
void devide(int n){
tot=0;
for(int i=2;i<=sqrt(n);++i){
if(n%i==0){
++tot;
p[tot]=i;
c[tot]=0;
while(n%i==0){
n/=i;
++c[tot];
}
}
}
if(n>1){
++tot;
p[tot]=n;
c[tot]=1;
}
return;
}
int main(){
int n;
scanf("%d",&n);
devide(n);
for(int i=1;i<=tot;++i){
printf("%d %d\n",p[i],c[i]);
}
return 0;
}
欧拉筛版质因数分解
先进行欧拉筛 找出每个数的最小质因子
进行欧拉筛后的质因数分解时间复杂度为
O
(
l
o
g
n
)
O(log_n)
O(logn)
//核心:n只会被最小质因子筛掉
int cnt; //素数的个数
int v[N]; //存每个数的最小质因子
int prime[N]; //存素数
void get_primes(int n){
for(int i = 2;i <= n; ++i){
if(v[i] == 0){
v[i] = i;
prime[++cnt] = i;
}
for(int j = 1 ; j <= cnt;++j){
if(prime[j] > v[i] || i * prime[j] > n) break;
v[prime[j] * i] = prime[j];
}
}
}
void divide(int n) {
while (v[n]) {
printf("%d ", v[n]); // 在前
n /= v[n]; //在后
}
}