质因子分解:首先满足分解的因子为质数(1不为质数)任何一个自然数都可以分解为质数的乘积例如:15=3*5 20=2*2*5 所以15的质因子为3和5 ,20的质因子为2 和5
用公式来说就是 其中p1 p2 等都是质因子,x的因子的个数
因子分解:分解的因子可以不为质数,例如:20=1*20 20=2*10 20=4*5 所以因子(这里求的是不包括自身的因子):1,2,4,5,10原理就是:枚举[1,n½] 找出区间内能被n整除的数,找到一个就可以找到俩个因子。
质因子分解还可以先对素数进行筛选,再找质因子比较简单 可以参考这篇博客:https://blog.csdn.net/qq_44797733/article/details/104702311
code:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
const int N=100;//因子和质因子分解100以内的数
int num=0;
map<int ,int> mp;//记录每个质因子的次数
int a[N];
void cal1(int x ){
for(int i=2;i<=x/i;i++){//不i*i<=n的原因是防止爆int
if(x%i==0) a[num++]=i;
while(x%i==0){
mp[i]++;
x/=i;
}
}
if(x>1) a[num++]=x,mp[x]++;//可能最后一个没有算上,特殊判断一下
}
void cal2(int x){
a[num++]=1;
for(int i=2;i<=x/i;i++){
if(x%i==0){//一个数可以产生俩个因子,只要俩个因子不相同
a[num++]=i;
if(x/i!=i) a[num++]=x/i;
}
}
}
int main()
{
int n;
cin>>n;
int k;//如果是1质因子分解如果是0因子分解
cin>>k;
if(k){
cal1(n);
for(int i=0;i<num;i++){
cout<<a[i]<<" "<<mp[a[i]]<<endl;
}
}
else{
cal2(n);
for(int i=0;i<num;i++){
cout<<a[i]<<" ";
}
}
return 0;
}
输入:20 1(质因子分解)
输出:2 2
5 1
输入:20 0(因子分解)
输出:1 2 10 4 5