本文已参与「新人创作礼」活动,一起开启掘金创作之路。
质因数分解
质因数分解的概念
也就是说任意一个数都可以被分解为若干个质数的整数次幂相乘,根据这个特征我们可以用代码实现质因数的分解
代码
下面我们以对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保存在数组中以便于后续的验证,验证时我们采用快速幂的方式
线性筛和快速幂的相关知识可以查看以下文章
约数
根据约数定理可得: 在进行质因数分解之后根据ki即可求的约数,代码为
int ans=1;
for(int i=0; i < kl; i++){
ans *= (K[i]+1)
}
cout<<ans<<endl;