质因数分解
质因数分解的概念
一
个
数
A
=
p
1
k
1
⋅
p
2
k
2
⋅
⋅
⋅
p
n
k
n
,
其
中
p
i
为
质
数
恒
成
立
一个数A=p_1^{k_1} \cdot p_2^{k_2} \cdot \cdot \cdot p_n^{k_n}, 其中p_i为质数恒成立
一个数A=p1k1⋅p2k2⋅⋅⋅pnkn,其中pi为质数恒成立
也就是说任意一个数都可以被分解为若干个质数的整数次幂相乘,根据这个特征我们可以用代码实现质因数的分解
代码
下面我们以对200以内的数进行质因数分解以及验证为例给出实现代码
#include<iostream>
#include<cmath>
using namespace std;
bool flag[205];
int prim_list[205];
int pl = 0;
int P[205];
int K[205];
int kl=0;
void prim(int end){
for(int i=2; i <= end; i++){
if(!flag[i]){
prim_list[pl++]=i;
for(int j=2; j* i <= end; j++){
flag[j*i] = true;
}
}
}
}
void prim_divid(int a){
for(int i=0; i < pl; i++){
int cnt=0;
while(a % prim_list[i]==0){
cnt++;
a /= prim_list[i];
}
if(cnt){
P[kl] = prim_list[i];
K[kl] = cnt;
kl++;
}
}
}
int qpow(int a, int p){
int ans=1;
while(p){
if(p & 1){
ans *= a;
}
a *= a;
p >>= 1;
}
return ans;
}
int main(){
prim(200);
for(int a=1; a <= 100; a++){
kl=0;
prim_divid(a);
cout<<a<<"的质因数分解结果:";
for(int i=0; i < kl; i++){
if(i){
cout<<"*";
}
cout<<P[i]<<"^"<<K[i];
}
int ans = 1;
for(int i=0; i < kl; i++){
ans *= qpow(P[i], K[i]);
}
cout<<" 验证结果:" <<ans<<endl;
}
return 0;
}
代码解释
这里我们通过线性筛来求质数,并且将分解出来的p和k保存在数组中以便于后续的验证,验证时我们采用快速幂的方式
线性筛和快速幂的相关知识可以查看以下文章
约数
根据约数定理可得:
A
的
约
数
个
数
为
:
∏
i
=
0
n
(
k
i
+
1
)
A的约数个数为:\prod_{i=0}^n(k_i+1)
A的约数个数为:i=0∏n(ki+1)
在进行质因数分解之后根据ki即可求的约数,代码为
int ans=1;
for(int i=0; i < kl; i++){
ans *= (K[i]+1)
}
cout<<ans<<endl;