Por Nacho Cabanes
Nivel de dificultad aproximado (1 a 5): 3
Yuki es una chica con suerte. Su abuela Chika es una encantadora anciona, propietaria de una granja de ovejas, experta repostera y ninja de la costura, y tiene un avellanero detrás de casa. Yuki pide avellanas continuamente, pero su sabia abuela no permite que Yuki coma demasiadas para que no caiga enferma.
Chika es aficionada a los números binarios, así que propuso este juego a Yuki: ella diría un número N y Yuki escogería dos números, x e y, tales que x + y = N. Entonces, Chika daría a Yuki tantas avellanas como la cantidad de unos que tengan x e y en base 2. Por ejemplo, si Chika propone 7 y Yuki escoge 3 y 4, recibiría 2 (porque 3 en base 2 es 11) y 1 (porque 4 en base 2 es 100): 3 avellanas.
Yuki quiere saber la máxima cantidad de avellanas que podría obtener de Chika.
Entrada: La primera línea es el número de casos, y a continuación, cada caso en una nueva línea (un número entero, entre 0 y 10^19, que puede no caber en un entero de 32 bits).
Salida: Para cada caso, una línea conteniendo "Caso #x: M", donde x es el número de caso (desde 1) y M es el número máximo de avellanas.
(Asegúrate de que has leído las preguntas frecuentes antes de plantear tu solución)
Ejemplo de entrada:
3
1
6
2135Salida correspondiente:
Caso #1: 1
Caso #2: 4
Caso #3: 14
Original en: Pregunta 2 del concurso Tuenti 2012
// Reto 012: La abuela binaria // Propuesta de solución por Chiki // 09-Ene-2014 import java.util.Scanner; public class AbuelaBinaria { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cantidad = sc.nextInt(); for(int i=0; i<cantidad; i++) { int numero = sc.nextInt(); System.out.println("Caso #" + (i+1) + ": " + numeroAvellanas(numero)); } } public static int numeroAvellanas(int numero){ int x = 0; int y = 0; int suma = -9999; int total = 0; for (int i = 0; i < numero; i++) { x = numero - i; y = i; total = devuelveCantidadBinario(x)+devuelveCantidadBinario(y); if(suma< total){ suma = total; } } return suma; } public static int devuelveCantidadBinario(int numCantidad){ int cantidad1 = 0; String numeroBinario=""; while(numCantidad/2 != 0){ numeroBinario += (numCantidad%2); numCantidad = (numCantidad/2); } numeroBinario+=numCantidad; for (int i = 0; i < numeroBinario.length(); i++) { if(String.valueOf(numeroBinario.charAt(i)).equals("1")){ cantidad1++; } } return cantidad1; } }