Autor Tema: [Java] generar números que no tengan una cifra (dígito) repetida hasta límite  (Leído 4634 veces)

Sixtoex

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 105
    • Ver Perfil
Bueno antes que nada quiero saber si el algoritmo de este programa es básico-intermedio o avanzado, creo que es el ejercicio mas dificil que  hice  :-X


"Crear una clase que solicite por pantalla un número y sea capaz de generar por pantalla todos
los números menores que el introducido que no tengan ninguna cifra repetida."

Por ejemplo si das el 1000, que te de los números menores que 1000 los cuales no contienen ninguna cifra repetida como el caso de 828.


El problema es que solo puedo hasta 3 cifras, es decir podría mas pero sería todo manual, no se si me explico, es decir podría poner 1 mas pero una de 5 cifras no me funcionaria   :(

Entonces pido ayuda a los sabios del foro

¿alguna pista?

Código: [Seleccionar]
import java.util.Scanner;
public class Calculos_conMath {
 
public static void main(String[] args) {
     Scanner numero = new Scanner(System.in);
     System.out.println("Escribe un numero");
     int leerNumero =  numero.nextInt();
     String x = Integer.toString(leerNumero);
     int longitud = x.length();
     int[] leerNumeroTotal = new int[leerNumero*2];
     int cont = 0;
     int[] separar = new int[leerNumero*9999];
     int imprimir = 0;
    int z = 0;
     
    for(int i = 0; i < leerNumero;i++)
    {
   
        leerNumeroTotal[i] = i;
        z = 0;
        if(leerNumeroTotal[i] > 9){
        while( z <= longitud-1){
        separar[cont++] = leerNumeroTotal[i] % 10;
            leerNumeroTotal[i] = leerNumeroTotal[i] /10;
            z++;
        }
   
       
         
          if(separar[imprimir] != separar[imprimir+2] && separar[imprimir+2] != separar[imprimir+1]&&separar[imprimir] != separar[imprimir+1]){
         
          System.out.println(i);
          }
          imprimir = imprimir + 3 ;
       
        }
           
       
    }
   

}
}

Nota: Tambien quiero dejar claro que solo da hasta el 900 jajaja, paso de mirar ya el error, que ejercicio mas loco, seguro que con metodos se hace mas fácil
« Última modificación: 17 de Noviembre 2014, 23:17 por Alex Rodríguez »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:[Java] Hacer que no se repita numeros
« Respuesta #1 en: 17 de Noviembre 2014, 07:58 »
Hola el nivel del ejercicio se puede decir que es intermedio. No es básico, pero tampoco es algo excesivamente complicado. Para resolver con más cifras podrías hacerlo con expresiones regulares (pero necesitas comprender y saber usar las expresiones regulares) o transformando los números generados en cadenas de texto y analizando cada uno de los caracteres para comprobar que no se repiten. Saludos!!!

Sixtoex

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 105
    • Ver Perfil
Re:[Java] Hacer que no se repita numeros
« Respuesta #2 en: 17 de Noviembre 2014, 14:10 »
Se puede hacer sin usar expresiones regulares, es decir la solucion es:

Para que funcione con n cifras tienes que comparar el primero con todos los demás, el segundo con todos los que le siguen (con el primero ya está comparado de antes), el tercero con todos los que le siguen, etc.

El problema es que no se adaptar eso al código, por que el problema principal es

Como hago eso si  por ejemplo analizamos el 32 ok, Lo analiza así:

posición 0: 2
posicion 1: 3
Posicion 2: 3
posicion 3: 3
Es decir como saber cuando termina la cifra para que no siga analizando, es decir el 2 de la posición 0, lo analizara con la posición 1,2 y 3. y lo envidente sería que solo analizara el 0 y el 1 por que es la cifra total.
Nota: Este problema creo que se soluciona sabiendo la longitud, pero tampoco se implementarlo exactamente para que funcione.

Pero estoy bloqueado seguro que es fácil, si alguien del foro puede adaptarlo con mi código (la solución) pues seguro que se enciende mi LUZ, y ya aprendo  ;D

 
« Última modificación: 17 de Noviembre 2014, 14:24 por Sixtoex »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Hay muchas formas de hacerlo, con bucles anidados, con recursión, usando la clase math o no, etc. Este código es un ejemplo alternativo para resolverlo:

Código: [Seleccionar]
import java.util.Scanner;

//aprenderaprogramar.com
public class Test {
    public static void main(String[]arg){

        Scanner numero = new Scanner(System.in);
     System.out.print("Escribe un numero: ");
     int leerNumero =  numero.nextInt();
       
     for (int i=1; i<leerNumero; i++) {
         if (todosSusDigitosSonDistintos(i)) {
             System.out.println(i);
            }
        }

    }//Fín metodo main
   
     private static boolean todosSusDigitosSonDistintos(int numero) {
     int numMask = 0;
     int numDigits = (int) Math.ceil(Math.log10(numero+1));
     for (int digitIdx = 0; digitIdx < numDigits; digitIdx++) {
         int curDigit = (int)(numero / Math.pow(10,digitIdx)) % 10;
         int digitMask = (int)Math.pow(2, curDigit);             
         if ((numMask & digitMask) > 0) return false;
         numMask = numMask | digitMask;
     }
     return true;
 }
       
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".