什么是分解质因数
质因子分解:将一个正整数n写成一个或多个质数的乘积的形式。
思路
求出区间[a,b]中所有整数的质因数分解。
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)
样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
先筛出所有素数,构建素数表,然后再分解。
素数的判断:如果在2~n-1之间存在n的约数,设为k,即n%k = 0,那么k*(n/k) = n,即n/k也为n的一个约数,且k与n/k中一定满足其中一个≤sqrt(n),另一个≥sqrt(n)【sqrt(n)为根号n】。所以只要判定n能否被2,3,…,|sqrt(n)|中的一个数整除,即可判定n是否为素数
对于一个正整数n来说,如果他存在1和本身之外的因子,那么一定是在sqrt(n)左右成对出现。因此,对于正整数n来说,如果它存在[2,n]范围内的质因子,要么这些质因子全部小于等于sqrt(n),要么只存在一个大于sqrt(n)的质因子,其他全部小于等于sqrt(n)。
分解质因数:
- 枚举1~sqrt(n)范围内的所有质因子p(建一个素数表list),判断 p是否是n的因子(能否整除)
① 如果是,那么给ans结果数组中增加p,并初始化其个数为0。然后,只要p还是n的因子,就不断n除以p,每次操作令p的个数加1,直到p不是n的因子为止
② 如果不是,直接跳过 - 如果在上面的步骤结束后n仍然>1,说明n有且仅有一个大于sqrt(n)的质因子,这时需要把这个质因子加入ans结果数组,令其个数为1
至此,ans数组中存放的就是质因子分解的结果。
python可以用字典表示 {质因子:个数}
C++可以使用结构体:
定义结构体factor用来存放质因子及其个数。
struct factor{
int x, cnt; //x为质因子,cnt为其个数
}fac[10];
由于2×3×5×7×11×13×17×19×23×29就已经超过了int范围,所以对int型的数来说数组大小只需要开到10就可以了。
C++
给出一个int范围的整数,按照从小到大的顺序输出其分解为质因数的乘法算式。
例如97532468 = 2^211171011291
#include<bits/stdc++.h>
using namespace std;
const int maxn =100010;
int prime[maxn],pNum = 0;//prime为素数表
bool p[maxn] = {
false};
void Find_Prime(){
//构建素数表
for(int i =2;i<maxn;i++){