0
点赞
收藏
分享

微信扫一扫

数据因式分解


['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;

}

举报

相关推荐

0 条评论