Sprawdziłem, sposób z utworzeniem na starcie wszystkich dopuszczalnych iloczynów dość szybko (m=3, n=3
) działa nieakceptowalnie wolno i wymaga zwiększenia pamięci dla JVM.
Poniższy kod działa zadowalająco dla:
n=3 m=3 wynik = 967 262 769,
n=4 m=2 wynik = 67 144 176,
n=2 m=4 wynik = 99 000 099
dalej nie sprawdzałem - wyniki pośrednie nie mieszczą się w typie int
.
import java.util.*;
import java.awt.Point;
public class Products
{
ArrayList<Integer> factors = new ArrayList<Integer>();
int lowerBound;
int upperBound;
int n;
//------------------------
public static void main(String[] args)
{
new Products();
}
//------------------------
public Products()
{
Scanner sc = new Scanner(System.in);
System.out.print("Ile czynnikow: ");
n = sc.nextInt();
System.out.print("Ile cyfr: ");
int m = sc.nextInt();
lowerBound = (int)Math.pow(10,m - 1);
upperBound = (int)Math.pow(10,m) - 1;
for(int i=lowerBound;i<=upperBound;i++)
{
factors.add(i);
}
int max = (int)Math.pow(upperBound,n);
int min = (int)Math.pow(lowerBound,n);
for(int i=max;i>=min;i--)
{
if(isPalindrome(i))
{
boolean founded = true;
Set<Integer> set = new HashSet<Integer>();
set.add(i);
for(int k=n-1;k>0;k--)
{
set = dividers(set,k);
if(set.isEmpty())
{
founded = false;
break;
}
}
if(founded)
{
System.out.println(set);
System.out.println(i);
break;
}
}
}
}
//------------------------
private boolean isPalindrome(int n)
{
ArrayList<Integer> digits = new ArrayList<Integer>();
while(n > 0)
{
digits.add(n % 10);
n/=10;
}
int len = digits.size();
for(int i=0;i<len/2;i++)
{
if(digits.get(i) != digits.get(len-1-i))
{
return false;
}
}
return true;
}
//------------------------
private Set<Integer> dividers(Set<Integer> input, int depth)
{
Set<Integer> result = new HashSet<Integer>();
int min = (int)Math.pow(lowerBound,depth);
int max = (int)Math.pow(upperBound,depth);
for(int k: factors)
{
for(int n: input)
{
if(n % k == 0)
{
int m = n/k;
if(m >= min && m <= max)
{
result.add(m);
}
}
}
}
return result;
}
}