模板:
1.去重过的:
typedef long long ll;
ll fac[10050], num;//素因数,素因数的个数
void init(ll n) {//唯一分解定理
num = 0;
ll cpy = n;
int m = (int)sqrt(n + 0.5);
for (int i = 2; i <= m; ++i) {
if (cpy % i == 0) {
fac[num++] = i;
while (cpy % i == 0) cpy /= i;
}
}
if (cpy > 1) fac[num++] = cpy;
}
2.不去重的:
void init(ll n) {//唯一分解定理
num = 0;
ll cpy = n;
int m = (int)sqrt(n + 0.5);
for (int i = 2; i <= m; ++i) {
if (cpy % i == 0) {
while (cpy % i == 0){
fac[num++] = i;
cpy /= i;
}
}
}
if (cpy > 1) fac[num++] = cpy;
}
例题:
例1:https://sdnuoj.rainng.com/problem/show/1427
代码1:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const int N = 100 + 7;
const int M = 1e6 + 7;
int a, b;
ll fac[10050], num;//素因数,素因数的个数
void init(ll n) {//唯一分解定理
num = 0;
ll cpy = n;
int m = (int)sqrt(n + 0.5);
for (int i = 2; i <= m; ++i) {
if (cpy % i == 0) {
while (cpy % i == 0){
fac[num++] = i;
cpy /= i;
}
}
}
if (cpy > 1) fac[num++] = cpy;
}
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> a >> b;
for (int i = a; i <= b; ++i){
memset(fac, 0, sizeof fac);
num = 0;
init(i);
cout << i << "=";
for (int j = 0; j < num - 1; ++j){
cout << fac[j] << "*";
}
cout << fac[num - 1] << endl;
}
return 0;
代码2:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const int N = 1e4 + 7;
int a, b, num, prime[N], fac[N];
bool isprime[N];
void primes(){
num = 0;
memset(isprime, 1, sizeof isprime);
isprime[0] = isprime[1] = 0;
for(int i = 2; i < N; i++){
if(isprime[i]){
prime[num++] = i;
for(int j = i + i; j < N; j += i)
isprime[j] = 0;
}
}
}
int main(){
primes();
cin >> a >> b;
for(int i = a; i <= b; i++){
int cnt = 0, cpy = i;
for(int j = 0; j < num && prime[j]*prime[j] <= i; j++){
if(cpy % prime[j] == 0){
while(cpy % prime[j] == 0){
fac[cnt++] = prime[j];
cpy /= prime[j];
}
}
}
if(cpy > 1) fac[cnt++] = cpy;
cout << i << "=";
bool flag = 0;
for(int j = 0; j < cnt; j++){
if(flag) cout << "*";
flag = 1;
cout << fac[j];
}
cout << endl;
}
return 0;
}