import
java.util.ArrayList;
import
java.util.HashSet;
import
java.util.List;
import
java.util.Set;
public
class
PrimeFactorization {
public
static
List<Integer>
primeFactorsTrialDivision(
int
n)
{
List<Integer> factors =
new
ArrayList<>();
int
i =
2
;
while
(i * i <= n) {
if
(n % i ==
0
) {
factors.add(i);
n /= i;
}
else
{
i++;
}
}
if
(n >
1
) {
factors.add(n);
}
return
factors;
}
public
static
int
countPrimeFactors(
int
n)
{
List<Integer> factors
= primeFactorsTrialDivision(n);
Set<Integer> uniqueFactors =
new
HashSet<>(factors);
return
uniqueFactors.size();
}
public
static
int
maxPrimeFactorsPrimeFactorization(
int
n)
{
int
maxCount =
0
;
int
maxNum =
0
;
for
(
int
i =
1
; i <= n; i++) {
int
count = countPrimeFactors(i);
if
(count > maxCount) {
maxCount = count;
maxNum = i;
}
}
return
maxNum;
}
public
static
void
main(String[] args)
{
int
n =
10
;
System.out.println(
"Input: N = "
+ n);
System.out.println(
"Number of prime factors of each number:"
);
for
(
int
i =
1
; i <= n; i++) {
List<Integer> factors
= primeFactorsTrialDivision(i);
Set<Integer> uniqueFactors
=
new
HashSet<>(factors);
int
count = uniqueFactors.size();
System.out.println(i +
" : "
+ count);
}
int
maxNum = maxPrimeFactorsPrimeFactorization(n);
System.out.println(
maxNum
+
" has the maximum number of prime factors among all numbers from 1 to "
+ n);
n =
40
;
System.out.println(
"Input: N = "
+ n);
maxNum = maxPrimeFactorsPrimeFactorization(n);
System.out.println(
maxNum
+
" has the maximum number of prime factors among all numbers from 1 to "
+ n);
}
}