定义:一个数如果只能被他本身和1整除,那么他就是质因数。
质因数分解:一个数如果不是质数就是非质数,非质数可以分解为比他小的质数的乘积。
首先判断一个数是否是质数,如果是合数,则进行分解。
合数可以分解为非递减的素数相乘的乘积,所以首先要找出小于这个合数的素数。找出素数可以用改进的筛素数法。但是求出全部小于要分解的合数的所有素数没有必要,可以先求一个素数为i,当n%i != 0时用改进的筛素数法求下一个素数,并将赋值给i。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int const MAXN = 9870;
bool flag[MAXN];
int primes[MAXN / 3], pi=0;
//由上一个质数返回下一个质数
int GetPrime_2(int last_prime)
{
int i, j;
bool find_prime = false;
for (i = last_prime+1; i < MAXN; i++)
{
if (!flag[i]) {
primes[pi++] = i;
find_prime = true;
}
for (j = 0; (j < pi) && (i * primes[j] < MAXN); j++)
{
flag[i * primes[j]] = true;
if (i % primes[j] == 0) //这句保证每个非素数只被筛去一次
break;
}
if (find_prime)
return i;
}
return 0;
}
void int_to_pri_mul_pri(int a){
int i= GetPrime_2(1);
while(1){
while (a%i==0)
{
printf("%d\n",i);
a/=i;
if (a==1)
return;
}
i = GetPrime_2(i);
}
}
int main(){
memset(flag, 0, sizeof(flag));
int_to_pri_mul_pri(MAXN);
system("pause");
}
注意的地方:由于要设置标志位,所以分解的数越大flag数组占用的空间越大。
分解之前一定要先判断是否为合数。如果对质数分解会将小于此质数的数全部筛选一遍,增加了复杂度。
可以使用bitmap来存储标志位,这样可以节省空间。