#求质因子
一般做数论的题目的时候,总会发现有质数的影子。质因子也是一个很重要的存在,所以今天做一下求质因子的笔记。求质因子的话,可以先素数打表,然后从素数中挑选某一个数的所有质因子,但是这样时间和空间上都会有所损耗,所以我们常用的找所有质因子的方法还是素数打表和寻找因子直接结合。
这里简单说一下第二种:
void prime(int n)
{
cnt = 0;
for(int i = 2; i * i <= n; i++)
{
if(n % i == 0) //如果找到一个因子就记录
{
p[cnt] = i; //这里的p数组是存质因子的,a数组用来存该质因子的指数
a[cnt] = 0;
while(n % i == 0) //循环把该因子除完,又因为我们从小到大开始遍历,这样就不会存在该因子的倍数,这个也一定是质因子
{
n /= i;
a[cnt]++; //能整除就在指数上加一次
}
}
cnt++;
}
if(n > 1)
{
p[cnt] = n;
a[cnt++] = 1;
}
}
因为这里是找所有的质因子,不是全部因子,所以1是没有输出的
#include
using namespace std;
const int maxn = 1e5+10;
int p[maxn], a[maxn];
int cnt = 0;
void prime(int n)
{
cnt = 0;
for(int i = 2; i * i <= n; i++)
{
if(n % i == 0)
{
p[cnt] = i;
a[cnt] = 0;
while(n % i == 0)
{
n /= i;
a[cnt]++;
}
}
cnt++;
}
if(n > 1)
{
p[cnt] = n;
a[cnt++] = 1;
}
}
int main()
{
int n;
while(~scanf("%d", &n))
{
prime(n);
for(int i = 0; i < cnt; i++)
{
printf("p%d : %d, a%d : %d\n", i+1, p[i], i+1, a[i]);
}
printf("\n-----------------------\n");
}
return 0;
}