1. 程式人生 > >合數的因式分解(遞迴求解,兩種方法)

合數的因式分解(遞迴求解,兩種方法)

#include <stdio.h>
#include <math.h>
//判斷一個數是不是素數
int isPrime(int n)
{
    if(n<2)return 0 ;
else{

int t = (int)sqrt(n);
int i;
for ( i=2 ; i <= t; i++ )
{
if( n%i==0 )
return 0 ;

}

}

return 1;
}
//遞迴進行因式分解
/**
m為要分解的數,當m=1(m/n=1即m=n)時遞迴結束,函式相當於從2開始找m的因子,一直到m. n∈[2,m]
*/
void factorize(int m,int n)
{
if (m==1) return;
if (m%n) //n不是m的因數
{
factorize(m,n+1);
}
else
{
printf("%d ",n);
factorize(m/n,n);
}
}


/************************************************************************/
/* /* 任意在2~n-1中找兩個因數(不一定要質因數)i和j,即i*j=n;
如果i是質數,則i一定是n的一個質數,否則繼續對i進行分解。
如果j是質數,則j一定是n的一個質數,否則繼續對j進行分解。                                                                      */
/************************************************************************/
void factorize2(int n)
{
int i ;
    for ( i = 2 ; i < n ; i++ )//任意在2~n-1中找兩個因數(不一定要質因數
{

if( n % i == 0 )//i為質數
{
printf("%d ",i);
if(isPrime(n/i))
{
printf("%d ",n/i);
}
else
{
factorize2(n/i);
}
break ;
}

}
}


int main()
{
int number;
while(1)
{
printf("請輸入一個合數進行分解:\n");
scanf("%d",&number);
if(isPrime(number))
{
printf("該數不是合數,請重新輸入\n");
continue ;
}
printf("遞迴方法1:\n");
factorize(number,2);
printf("\n\n");

printf("遞迴方法2:\n");
factorize2(number);
printf("\n\n");

}

return 0 ;
}