数据因式分解:factorize
['fæktəraɪz]
因数:factor
(一)因式分解简介:
因式分解是将一个数分解为几个素数的乘积。
对于充分大的数N,将2到sqrt(N)中所有的素数从小到大排起来,
然后从2开始,用N除以2,再用除得的商除以2,直到不能整除,
再用此时的商除以下一个素数3,依次直到所得的商为素数为止。
(二)方法一:
(2.1)思想:
将2到sqrt(N)中所有的素数从小到大排起来
(2.2)步骤:
1)求出:将2到sqrt(N)中所有的素数从小到大排起来。
2)再用一个个素数去整除n,n=n/素数;
(2.3)代码实现 :
int primes[100];
int count=0;
void primesLessThanN(int n){
if(n>2){
primes[0]=2;
count=1;
}
for(int i=3;i<n;i+=2){
int sqrt=sqrt(i);//根号i
for(int j=0;primes[j]<=sqrt && i%primes[j]!=0 ;j++);
//判断i是否为素数,用<=根号i的素数去整除i。
if(primes[j]>sqrt) {
primes[count++]=i;
}
}
}
int factor[20];//存储n的因子。
int count2=0;
void factorize(int n){
if(n<4){//4以内的数不需要分解
factor[0]=n;
return ;
}
int sqrt_n=sqrt(n);
primesLessThanN(sqrt_n);
while(int i=0;primes[i]<=sqrt_n;){
if(n%primes[i]==0){
factor[count2++]=primes[i];
n=n/primes[i];
}
else {
i++;
}
}
if(n!=1) facotr[count2]=n;
}
------
(三)方法二:
//函数decomp_integer对n分解素因数,分解后的素数存入facArr数组,并返回因子的个数
int decomp_integer( DWORD n, DWORD facArr[])
{
DWORD fac; //n的可能的一个因子
int count;
if (n<4) //4以内的数,不需要分解
{
facArr[0]=n; return 1;
}
count=0;
//下面的while循环为2试出n,直到2不是n的因子为止
while ( (n & 1)==0) // 这里判断偶数用 (n &1)==0,这比(n % 2)==0更快
{
facArr[count++]=2; n=n>>1;
}
fac=3; //用3到sqrt(n)之间的奇数试除
while (fac*fac<=n) // fac*fac <= n
{
while (n % fac==0)
{
facArr[count++]=fac;
n /= fac;
}
fac+=2;
}
if (n==1)
return count;
facArr[count++]=n;
return count;
}
因数:factor
(一)因式分解简介:
因式分解是将一个数分解为几个素数的乘积。
对于充分大的数N,将2到sqrt(N)中所有的素数从小到大排起来,
然后从2开始,用N除以2,再用除得的商除以2,直到不能整除,
再用此时的商除以下一个素数3,依次直到所得的商为素数为止。
(二)方法一:
(2.1)思想:
将2到sqrt(N)中所有的素数从小到大排起来
(2.2)步骤:
1)求出:将2到sqrt(N)中所有的素数从小到大排起来。
2)再用一个个素数去整除n,n=n/素数;
(2.3)代码实现 :
int primes[100];
int count=0;
void primesLessThanN(int n){
if(n>2){
primes[0]=2;
count=1;
}
for(int i=3;i<n;i+=2){
int sqrt=sqrt(i);//根号i
for(int j=0;primes[j]<=sqrt && i%primes[j]!=0 ;j++);
//判断i是否为素数,用<=根号i的素数去整除i。
if(primes[j]>sqrt) {
primes[count++]=i;
}
}
}
int factor[20];//存储n的因子。
int count2=0;
void factorize(int n){
if(n<4){//4以内的数不需要分解
factor[0]=n;
return ;
}
int sqrt_n=sqrt(n);
primesLessThanN(sqrt_n);
while(int i=0;primes[i]<=sqrt_n;){
if(n%primes[i]==0){
factor[count2++]=primes[i];
n=n/primes[i];
}
else {
i++;
}
}
if(n!=1) facotr[count2]=n;
}
------
(三)方法二:
//函数decomp_integer对n分解素因数,分解后的素数存入facArr数组,并返回因子的个数
int decomp_integer( DWORD n, DWORD facArr[])
{
DWORD fac; //n的可能的一个因子
int count;
if (n<4) //4以内的数,不需要分解
{
facArr[0]=n; return 1;
}
count=0;
//下面的while循环为2试出n,直到2不是n的因子为止
while ( (n & 1)==0) // 这里判断偶数用 (n &1)==0,这比(n % 2)==0更快
{
facArr[count++]=2; n=n>>1;
}
fac=3; //用3到sqrt(n)之间的奇数试除
while (fac*fac<=n) // fac*fac <= n
{
while (n % fac==0)
{
facArr[count++]=fac;
n /= fac;
}
fac+=2;
}
if (n==1)
return count;
facArr[count++]=n;
return count;
}