Esto puede ser un problema simple para muchos, pero por mi vida no puedo averiguar qué está mal con mi código.

Se supone que debo devolver el número de números debajo de n (máximo 1000000) que tienen un 7 y un 9 en ellos. Por ejemplo, n = 10 devuelve 0, n = 100 devuelve 2 (de 79 y 97) etc.

int allWith7Or9(int n) 
{
  int count = 0;
  for(int i = 0; i < n; i++)
  {
    if(i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7 || i%1000000==7)
    {
      if(i%10==9 || i%100==9 || i%1000==9 || i%10000==9 || i%100000==9 || i%1000000==9)
      {
        count++;
      }
    }
  }
  return count;
}

Me doy cuenta de que podría haber usado &&, y lo intenté, pero mi código sigue apareciendo con 0, y no tengo idea de por qué. Implementé esto al menos 3 formas diferentes.

Editar:

También intenté esto:

int allWith7Or9(int n) 
{
  int count = 0;
  for(int i = 0; i < n; i++)
  {
    if((i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7
    || i%1000000==7) && (i%10==9 || i%100==9 || i%1000==9
    || i%10000==9 || i%100000==9 || i%1000000==9))
    {
      count++;
    }
  }
  return count;
}
0
Just A Mathematician 13 ene. 2018 a las 04:05

3 respuestas

La mejor respuesta
if(i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7 || i%1000000==7)
{
  if(i%10==9 || i%100==9 || i%1000==9 || i%10000==9 || i%100000==9 || i%1000000==9)
  {
    count++;
  }
}

Es básicamente

if(cond1)
{
  if(cond2)
  {
    count++;
  }
}

Que es básicamente:

if(cond1 && cond2)
{
  count++;
}

Ya que ambas condiciones deben ser verdaderas para incrementar count.

Y esas condiciones no son ciertas al mismo tiempo porque

i % 100 == 7

No es lo que probablemente quieres decir. Esto no busca números como 70, 71, etc., busca números que tienen un resto 7 cuando se divide entre 100, como 7, 107, 207. Entonces

i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7 || i%1000000==7

Solo coincide cuando i == 7, y

i%10==9 || i%100==9 || i%1000==9 || i%10000==9 || i%100000==9 || i%1000000==9

Solo coincide cuando i == 9. 7 != 9, por lo que el contador no se incrementará.


Puede reescribir las condiciones como:

i%10==7 || (i/10)%10==7 || (i/100)%10==7 etc

Pero escribirlo de esta manera es desordenado y propenso a errores.

En su lugar, use un bucle:

boolean found7 = false;
boolean found9 = false;
for (int ii = i; ii > 0: ii /= 10)  {
  switch (ii % 10) {
    case 7: found7 = true; break;
    case 9: found9 = true; break;
  }
}

if (found7 && found9) {
  count++;
}

Esto usa dos banderas para indicar cuál de los dígitos ha encontrado. Verifique el último dígito para ver si es 7 o 9, luego divídalo por 10 para descartar ese dígito y pasar al siguiente.

1
Andy Turner 13 ene. 2018 a las 10:21

El problema fundamental es que sus condiciones son incorrectas.

Por ejemplo, i % 100 == 7 no prueba si el dígito "decenas" de i es 7. en realidad prueba si los dos últimos dígitos son 07. Haz las matematicas ....

Para probar el dígito "decenas" es 7 en una sola expresión, debe usar algo como

(i / 10) % 10 == 7

(Debería poder encontrar una solución correcta de lo anterior. Y hay al menos dos enfoques diferentes que podría adoptar).

0
Stephen C 13 ene. 2018 a las 01:54

Ok, la primera condición es incorrecta. Por ejemplo 79. La condición para 7 no funciona 79% 10 = 9, 79% 100 = 79. Siete no se detecta. Debería ser algo así como iterar a través de todos los dígitos del número. Por lo tanto, verificar si hay un número puede ser así.

boolean have7and9(int a) {
  boolean seven = false, nine = false;  
  while(a > 0) {
    if (a%10 == 7) seven = true;
    if (a%10 == 9) nine = true;
    a /= 10;
  }
  return seven && nine;
}
1
Tomáš Dejmek 13 ene. 2018 a las 01:20