定义:一个数如果只能被他本身和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来存储标志位,这样可以节省空间。