Foros del Web » Programación para mayores de 30 ;) » Java »

Duda Hacer que no se repita numeros

Estas en el tema de Duda Hacer que no se repita numeros en el foro de Java en Foros del Web. "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 ...
  #1 (permalink)  
Antiguo 16/11/2014, 09:16
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Duda Hacer que no se repita numeros

"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.


Hice solo con 2 cifras, llevo simplemente 2-3 semanas con java y no se de muchas clases, quisiera saber si es posible hacer este ejercicio sin saber ninguna clase y método

Código:
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]; 
     int cont = 0;
     int[] separar = new int[leerNumero*2];
     int imprimir = 0;
    
     
    for(int i = 0; i < leerNumero;i++)
    {
    
        leerNumeroTotal[i] = i; 
    	
        if(leerNumeroTotal[i] > 9 && leerNumeroTotal[i] < 100)
        {
         	separar[cont] = leerNumeroTotal[i] / 10;
        	separar[cont+1] = leerNumeroTotal[i] % 10;      	  	
            cont = cont +2;
          
          if(separar[imprimir] != separar[imprimir+1]){
        	  
          	System.out.println(i);
          }
          imprimir = imprimir + 2;
        	
        }
           
        
    }
   

		
   }
Se hacer bucles,condicionales, buscar un poco en la api de java(aunque todavía no tanto) y todo por consola

¿Me espero un poco mas? parece complicado este ejercicio, pero por lo menos conseguí hacerlo con 2 cifras

Me da rabía no poder hacerlos con cualquier longitud
  #2 (permalink)  
Antiguo 16/11/2014, 10:13
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda Hacer que no se repita numeros

Hola:

Si te funciona, estupendo. De ahí a más cifras sólo tienes que generalizar un poco el algoritmo. Por ejemplo, tu ejemplo funciona con dos cifras porque haces esto

Código Java:
Ver original
  1. separar[cont] = leerNumeroTotal[i] / 10;
  2. separar[cont+1] = leerNumeroTotal[i] % 10;

es decir, / 10 y % 10. Si quieres hacerlo general, puedes hacer algo así

Código Java:
Ver original
  1. int i=0;
  2. while (numero > 0) {
  3.    cifra[i++] = numero % 10;
  4.    numero = numero / 10;
  5. }

Por ejemplo, si número es 123, te metes en el bucle y en la primera iteración te quedaría cifra[0]=3 (las unidades) y numero=12. En la siguiente iteración, cifra[1]=2 tendrías las decenas y número=1. Y la tercera iteración sería la última con cifra[2]=1.

No quiero resolverte el problema totalmente, pero imagino que entiendes la idea. Inténtalo y vuelve a escribir si te surge algo. Te queda ver el tamaño del array inicial y luego hacer la comparación de si tiene o no cifras iguales.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 16/11/2014, 11:19
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Duda Hacer que no se repita numeros

pffff ya llevo casi todo el día para hacer este ejercicio.. ¿que dificultad tiene? basico-intermedio-avanzado?



El problema es que, me quedado hay atascado, pongo que me imprima del 1 al 100 pero no quita los que se repite pff

Porfavor no me hagas el ejercicio amigo, dime pistas

Código Java:
Ver original
  1. import java.util.Scanner;
  2. public class Calculos_conMath {
  3.  
  4.     public static void main(String[] args) {
  5.      Scanner numero = new Scanner(System.in);
  6.      System.out.println("Escribe un numero");
  7.      int leerNumero =  numero.nextInt();
  8.      String x = Integer.toString(leerNumero);
  9.      int longitud = x.length();
  10.      int[] leerNumeroTotal = new int[leerNumero];
  11.      int cont = 0;
  12.      int[] separar = new int[leerNumero*2];
  13.      int imprimir = 0;
  14.     int z = 0;
  15.      
  16.     for(int i = 0; i < leerNumero;i++)
  17.     {
  18.    
  19.         leerNumeroTotal[i] = i;
  20.        
  21.         if(leerNumeroTotal[i] > 9){
  22.             while( z < longitud){
  23.             separar[cont++] = leerNumeroTotal[i] % 10;
  24.             leerNumero = leerNumeroTotal[i] /10;
  25.             z++;
  26.         }
  27.        
  28.        
  29.          
  30.           if(separar[imprimir] != separar[imprimir+1]){
  31.              
  32.             System.out.println(i);
  33.           }
  34.           imprimir++;
  35.            
  36.         }
  37.            
  38.        
  39.     }
  40.    
  41.  
  42.     }
  43. }

Última edición por sixtoex; 16/11/2014 a las 11:42
  #4 (permalink)  
Antiguo 16/11/2014, 12:01
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda Hacer que no se repita numeros

Hola:

Es nivel básico (sólo sintaxis de java y no hay que saber mucho java para hacerlo, solo bucles, if, arrays y poco más). Pero aunque el nivel de java necesario para hacerlo sea básico, la complejidad puede estar (como en este caso), en pensar el algoritmo. Un algoritmo puede ser muy complejo de pensar aunque luego se escriba con un java básico.

Algunas pistas. Veo que tienes todo un poco liado y con algunos errores que va a ser difícil solucionar. Por ejemplo, la mayoría de las variables que tienes declaradas (como cont, z, separar....) deberían estar declaradas dentro del bucle for y no fuera (o al menos, inicializarlas cada vez en el bucle). Estas variables son para cada número que quieras probar y no para todos inicializadas una única vez. La comparación que haces para saber si las cifras son distintas tampoco está bien, sólo comparas dos cifras y la variable imprimir, como las otras, solo la inicializas una vez al principio, por lo que compararías cifra1 y cifra2 del primer número, cifra3 y cifra4 del segundo número y así sucesivamente. Para evitar IndexOutOfBounds imagino que has puesto el int[] separar = new int[leerNumero*2].

Mi consejo es que vayas por partes. Intenta hacer un método o trozo de código que dado un número te diga si tiene o no cifras repetidas. Algo así

Código Java:
Ver original
  1. public boolean tieneCifrasRepetidas (int numero) {
  2.    // aquí tu código
  3. }

teniendo este método es fácil hacer el resto sin liarse mucho. ¿Imagino que lo de los métodos lo habeis dado?. Si no es así, haz el programa primero para que dado un número te diga si tiene o no cifras repetidas (pides el número y escribes en pantalla si las tiene o no.

Una vez que tengas claro el código que hace eso, sólo tienes que meterlo tal cual en un bucle para cada número que quieras comprobar.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 16/11/2014 a las 12:06
  #5 (permalink)  
Antiguo 16/11/2014, 12:07
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Duda Hacer que no se repita numeros

Mira maigo e modificado todo, y ahora esta mucho mejor, ahora por ejemplo el 222 si me lo quita o el 333 o el 444 etc etc.. pero no me quita por ejemplo el 323, o el 443 etc etc..

Código Java:
Ver original
  1. import java.util.Scanner;
  2. public class Calculos_conMath {
  3.  
  4.     public static void main(String[] args) {
  5.      Scanner numero = new Scanner(System.in);
  6.      System.out.println("Escribe un numero");
  7.      int leerNumero =  numero.nextInt();
  8.      String x = Integer.toString(leerNumero);
  9.      int longitud = x.length();
  10.      int[] leerNumeroTotal = new int[leerNumero];
  11.      int cont = 0;
  12.      int[] separar = new int[leerNumero*2];
  13.      int imprimir = 0;
  14.     int z = 0;
  15.      
  16.     for(int i = 0; i < leerNumero;i++)
  17.     {
  18.    
  19.         leerNumeroTotal[i] = i;
  20.         z = 0;
  21.         if(leerNumeroTotal[i] > 9){
  22.             while( z < longitud-1){
  23.             separar[cont++] = leerNumeroTotal[i] % 10;
  24.             leerNumeroTotal[i] = leerNumeroTotal[i] /10;
  25.             z++;
  26.         }
  27.        
  28.        
  29.          
  30.           if(separar[imprimir] != separar[imprimir+1]  ){
  31.              
  32.             System.out.println(i);
  33.           }
  34.           imprimir = imprimir + 2 ;
  35.            
  36.         }
  37.            
  38.        
  39.     }
  40.    
  41.  
  42.     }
  43. }
  #6 (permalink)  
Antiguo 16/11/2014, 13:41
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Duda Hacer que no se repita numeros

Ya lo termine...

Es un algoritmo avanzado?, pero ojo no funciona con 4 cifras, hasta 3, es que no se como hacer para que funcione con todas las cifras

Código Java:
Ver original
  1. import java.util.Scanner;
  2. public class Calculos_conMath {
  3.  
  4.     public static void main(String[] args) {
  5.      Scanner numero = new Scanner(System.in);
  6.      System.out.println("Escribe un numero");
  7.      int leerNumero =  numero.nextInt();
  8.      String x = Integer.toString(leerNumero);
  9.      int longitud = x.length();
  10.      int[] leerNumeroTotal = new int[leerNumero*2];
  11.      int cont = 0;
  12.      int[] separar = new int[leerNumero*9999];
  13.      int imprimir = 0;
  14.     int z = 0;
  15.      
  16.     for(int i = 0; i < leerNumero;i++)
  17.     {
  18.    
  19.         leerNumeroTotal[i] = i;
  20.         z = 0;
  21.         if(leerNumeroTotal[i] > 9){
  22.             while( z <= longitud-1){
  23.             separar[cont++] = leerNumeroTotal[i] % 10;
  24.             leerNumeroTotal[i] = leerNumeroTotal[i] /10;
  25.             z++;
  26.         }
  27.        
  28.        
  29.          
  30.           if(separar[imprimir] != separar[imprimir+2] && separar[imprimir+2] != separar[imprimir+1]&&separar[imprimir] != separar[imprimir+1]){
  31.              
  32.             System.out.println(i);
  33.           }
  34.           imprimir = imprimir + 3 ;
  35.            
  36.         }
  37.            
  38.        
  39.     }
  40.    
  41.  
  42.     }
  43. }
  #7 (permalink)  
Antiguo 16/11/2014, 15:58
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda Hacer que no se repita numeros

Hola:

Esto no es general

if(separar[imprimir] != separar[imprimir+2] && separar[imprimir+2] != separar[imprimir+1]&&separar[imprimir] != separar[imprimir+1])

solo sirve para 3 cifras y si el número tiene dos cifras igual sale mal. 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. Eso se consigue con dos bucles anidados, uno con i desde 0 hasta n-1 y el otro con j desde i+1 hasta n-1, comparando la cifra i con la j. Si cualquiera de ellos es igual, no se imprimer. Intenta impelmentarlo.

Estas cosas int[] separar = new int[leerNumero*9999]; no son elegantes.

Tal cual lo haces, si metes un número de tres cifras, dudo que te funcione bien con las los números de 0 a 99. Por ejemplo, si escribes 123, cuando el bucle de i vaya por el 1 .... ¿qué pasa? ¿comparas todo esto separar[imprimir] != separar[imprimir+2] && separar[imprimir+2] != separar[imprimir+1]&&separar[imprimir] != separar[imprimir+1]? ¿Qué cifras estás comparando?. ¿te saca correctamente por ejemplo, el 10, 12, 13, ....?

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 17/11/2014, 05:23
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Duda Hacer que no se repita numeros

Hola amigo, gracias pero que va, ya tengo un cacao, no consigo..Estoy cerca lo se, pero es que usted dijo esto:

Eso se consigue con dos bucles anidados, uno con i desde 0 hasta n-1 y el otro con j desde i+1 hasta n-1, comparando la cifra i con la j. Si cualquiera de ellos es igual, no se imprimer. Intenta impelmentarlo.

Es decir yo esa solución tambien la pensé pero el problema son 2:

1.- Como saber cuando termina un numero, es decir, si por ejemplo esto esta as:
El 32 por ejemplo:
numero[0] = 3;
numero[1] = 2;
numero[2] = 3;
numero[3] = 3;
Es decir el 3 sera analizado con la index 1,2,3, pero yo realmente quiero es que analice hasta el index 1(por que realmente el numero es ese)

El 2 problema: es que esa idea: 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.

La tuve ayer, pero no se implementarla, por el problema 1.

Así que si puedes implementar la solución en mi proyecto, osea adaptalo a mi proyecto porfavor.
Se que estaba cerca.
  #9 (permalink)  
Antiguo 17/11/2014, 07:38
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda Hacer que no se repita numeros

Hola:

Como te comento, tienes un poco de lío. Estás metiendo todas las cifras de todos los números en int[] separar = new int[leerNumero*9999], por lo que el 1 estaría en separar[0], el 2 en separar[1] y así sucesivamente, hasta el 10 que tendría el 1 en separar[9] y el 0 en separar[10] y así sucesivamente. Es decir, todo un lío para saber dónde empieza y acaba cada número.

Yo haría lo siguiente (pseudocodigo)

Código Java:
Ver original
  1. pide numero final al usuario
  2.  
  3. para cada numero desde 1 hasta numero final
  4.  
  5.    calcula longitud de numero (ya lo haces convirtiendo a String)
  6.    crea un array cifras de esa longitud
  7.    mete las cifras del numero en el array
  8.    haz la comprobacion de las cifras con los dos bucles que te dije (si solo hay una cifra, no entrará en el bucle más interno).

de esta forma queda mucho mas simple, no necesitas un array separar gigantesto.

y en genera, cuando tengas un problema intenta partirlo en problemas mas pequeños. Tu problema original (el enunciado) tiene un problema más pequeño que deberías resolver antes y que te comenté, que es saber si un número tiene cifras repetidas. Y si me apuras, de este puedes sacar otro más pequeño, separar un número en sus cifras. Si resuelves bien el problema pequeño, es más fácil ir aproximándose a la solución final.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #10 (permalink)  
Antiguo 18/11/2014, 10:02
 
Fecha de Ingreso: noviembre-2014
Mensajes: 34
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Duda Hacer que no se repita numeros

Hay me quede. ¿no podrías adaptar tu explicación a mi proyecto porfavor? es decir mi proyecto solo funciona con 2 cifras/ 3 cifras, adaptalo con tu explciacion de forma general, pero utilizando mi proyecto asi no lo tienes que hacer todo. porfavor, es que así no entiendo..

Código:
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[] cifra = new int[longitud];
    int z = 0;
     
     
   for(int i = 1; i <= leerNumero ;i++){
	   
	   
   }
       
      
       
    
    
        }
    }
  #11 (permalink)  
Antiguo 18/11/2014, 10:28
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda Hacer que no se repita numeros

Si no quieres que te haga el código, no sé qué más quieres que haga....


Código Java:
Ver original
  1. import java.util.Scanner;
  2. public class Calculos_conMath {
  3.  
  4.     public static void main(String[] args) {
  5.      Scanner numero = new Scanner(System.in);
  6.      System.out.println("Escribe un numero");
  7.      int leerNumero =  numero.nextInt();
  8.      String x = Integer.toString(leerNumero);
  9.  
  10.      // Estas dos lineas no van aqui, comentadas.
  11.      // int longitud = x.length();
  12.      // int[] cifra = new int[longitud];
  13.  
  14.      
  15.      
  16.    for(int i = 1; i <= leerNumero ;i++){
  17.        
  18.           calcula longitud de numero ( de i )
  19.    crea un array cifras de esa longitud   ( int[] cifra = new int[longitud de i];
  20.    mete las cifras del numero en el array
  21.  
  22.     boolean cifrasRepetidas=false;
  23.     for ( j = 0; j<cifras.length -1 ; j++) {
  24.             for (k=j+1, k<cifras.length; k++) {
  25.                  if (cifras[j] == cifras[k] ) {
  26.                        cifrasRepetidas = true;
  27.                  }
  28.             }
  29.     }
  30.  
  31.      if (!cifrasRepetidas) {
  32.                Sacar i.
  33.      }
  34.    
  35.    }
  36.        
  37.      
  38.        
  39.    
  40.    
  41.         }
  42.     }

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: clase, numeros, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:50.