之前的文章写过如何求解出指定数字的全部约数,这篇文章更进一步,求解出全部的质因数,比如,求36的质因数:2、2、3、3 与元素周期表类似,世间万物都是由周期表中的元素所组成,而所有的数字,也都是这些质因数,逐个累加而成 求解质因数的过程,需要知道原数字与其中某个质因数相除的商,所以不适合用Stream流式方法,所以核心逻辑代码,还是使用的普通的for、while语句来完成的
代码
public class Factor {
IntConsumer allFactors = value -> {
int root = Double . valueOf ( Math . sqrt ( value) ) . intValue ( ) ;
List < Integer > list = new ArrayList < > ( ) ;
IntStream . iterate ( 1 , v -> v + 1 ) . limit ( root)
. filter ( v -> value % v == 0 ) . forEach ( v -> {
list. add ( v) ;
int v1 = value / v;
if ( v1 != v) list. add ( v1) ;
} ) ;
Collections . sort ( list) ;
System . out. println ( list) ;
} ;
void allPrimeFactors ( final int value) {
List < Integer > list = new ArrayList < > ( ) ;
int root = Double . valueOf ( Math . sqrt ( value) ) . intValue ( ) ;
int dividend = value;
for ( int i = 2 ; i <= root; i++ ) {
while ( dividend % i == 0 ) {
if ( isPrime ( i) )
list. add ( i) ;
dividend = dividend / i;
if ( isPrime ( dividend) && divident > root) {
list. add ( dividend) ;
i = root + 1 ;
break ;
}
}
}
if ( list. size ( ) == 0 )
list. add ( value) ;
Collections . sort ( list) ;
System . out. println ( list) ;
}
boolean isPrime ( int v) {
if ( v == 2 || v == 3 || v == 5 ) return true ;
if ( v % 2 == 0 ) return false ;
int sqrtValue = Double . valueOf ( Math . sqrt ( v) ) . intValue ( ) ;
return IntStream . iterate ( 3 , oddValue -> oddValue + 2 ) . limit ( sqrtValue) . parallel ( )
. filter ( v1 -> v1 <= sqrtValue) . noneMatch ( v1 -> v % v1 == 0 ) ;
}
}
这里面判断一个数是不是质数,用到了Stream流的写法,这样总可以不算是挂羊头卖狗肉了 此文章代码的解释,在总目录中标示的其文章中也有详细解释,这里就不赘述了
测试代码
class FactorTest {
@Test
void test ( ) {
Factor factor = new Factor ( ) ;
factor. allFactors. accept ( 36 ) ;
factor. allPrimeFactors ( 97 ) ;
}
}