Your task is to find the minimal positive integer number Q so that the product of digits of Q is exactly equal to N.
Input
The input contains the single integer number N (0 ≤ N ≤ 109).
Output
Your program should print to the output the only number Q. If such a number does not exist print −1.
Sample
Input
10
Ouput
25
http://acm.timus.ru/problem.aspx?space=1&num=1014
La solucion consiste en descomponer el numero N en todos los factores posibles
que sean menores o igual que 9.
Luego acomodar estos factores obtenidos de tal manera que el numero formado
sea el menor posible.
Para lograr eso podemos ir diviendo buscando sus divisores
de mayor a menor, es decir comenzando con el 9 e ir disminuyendo hasta el 8, cada
divisor que encontremos lo añadimos de izquierda a derecha en la salida, de tal
manera que los divisores mas pequeños aparezcan a la izquierda y los mas grandes
aparezcan a la derecha, lo cual haria que el valor del numero formado sea minimo.
Ejm: N = 588 = 84 * 7 = 12 * 7 * 7 = 2 * 6 * 7 * 7
-> Numero Buscado = 2677
Obs: Si el numero tiene un factor primo mayor que 9, entonces no existiria solucion,
ya que un numero >= 10 no se podria representar como un solo digito en la solucion.
public class Problema1014
{
public static void main( String[] args ) throws Exception
{
int numero = sig();
System.out.println( buscar( numero ) );
}
public static String buscar( int numero )
{
// Verificamos los casos especiales
if( numero == 0 )
return "10";
if( numero == 1 )
return "1";
String salida = "";
// Buscamos de mayor a menor los divisores menores que 10
// y los vamos añadiendo a la salida de manera adecuada para
// que al final los digitos menores esten en el extremo
// izquierdo y los digitos mayores en el extremo derecho.
for( int i = 9; i > 1; i -- )
{
while( numero % i == 0 )
{
salida = i + salida;
numero = numero / i;
}
}
// El numero tiene un factor primo mayor que 9
if( numero > 1 )
return "-1";
else
return salida;
}
public static int sig() throws Exception
{
int val = System.in.read() - 48;
int car = System.in.read();
while( car > 47 && car < 58 )
{
val = 10 * val + car - 48;
car = System.in.read();
}
return val;
}
}
No hay comentarios:
Publicar un comentario