2009-02-23 14 views
10

Necesito crear un programa que calcule cuántas maneras puede agregar tres números para que equivalen a 1000.Calcular cuántas maneras puede agregar tres números para que equivalen a 1.000

Creo que este código debería funcionar, pero no escribe nada. ¿Qué estoy haciendo mal? ¿Algún consejo o solución?

using System; 

namespace ConsoleApp02 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      for(int a = 0; a < 1000; a++) 
      { 
       for(int b = 0; b < 1000; b++) 
       { 
        for(int c = 0; c < 1000; c++) 
        { 
         for(int puls = a + b + c; puls < 1000; puls++) 
         { 
          if(puls == 1000) 
          { 
           Console.WriteLine("{0} + {1} + {2} = 1000", a, b, c); 
          } 
         } 
        } 
       } 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 
+0

¿Cuál es el bucle más interno de? – Juliet

+0

Así es como debe hacerse una pregunta sobre la tarea. :-) –

+0

Dos pulgares arriba para ser honesto que es una tarea de tarea. :) –

Respuesta

16

Su bucle más interior (la iteración la variable puls) en realidad no tiene ningún sentido, y debido a la condición de que (puls < 1000) Console.WriteLine nunca se ejecuta.

Quizás deba probar si A + B + C es 1000, en su lugar.

También, usted encontrará que usted puede ser que falte un par combinaciones particulares de los números debido a los límites en sus bucles (en función del planteamiento del problema.)

+0

+1 por ayudar pero no por él. –

+0

¡Gracias! Traté de decir mi respuesta pensativamente. – mquander

+0

OK, voy a morder, ¿qué combinaciones faltan? Supongo que solo enteros positivos para A, B y C. –

1

No es necesario el bucle interno.

if (a+b+c == 1000) 
    write 
0

Una vez que el bucle más interno llega a 1000, que se desata del bucle y nunca cheques incluso si se trata de 1000 en la sentencia 'if'.

0

Ese código no dará respuesta.

El interior del ciclo agrega a + b + c y pone el resultado en puls. Sin embargo, detiene el ciclo antes de que puls pueda llegar a 1000, y luego prueba dentro de la instrucción for para ver si puls es igual a 1000. Por lo tanto, no obtendrá una respuesta.

Simplemente pruebe el pulso contra 1000 en el lazo interno. ¿Por qué?

0

Puede reemplazar su circuito más interno por bucle con solo una prueba de si (a + b + c == 1000) {...}. Luego puede agregar optimizaciones como: una vez que se ha encontrado una suma con una combinación, no es necesario continuar con el ciclo interno.

1

En su bucle interno final, "int puls = a + b + c; puls < 1000; puls ++" garantiza que el puls nunca = 1000, si puls no es inferior a 1000, sale del ciclo . Es por eso que obtiene no valores. Pero reconsidera tu lógica también.

0

El código no cubre los siguientes casos

  • 1000 + 0 + 0
  • 0 + 10000 + 0
  • 0 + 0 + 10000

El más bucle interior debe sea ​​un si en lugar de para.

No necesita {} si solo hay una instrucción en el bucle o cláusula if.

EDIT: del Código eliminó responde

+0

Por favor, oh por favor, no omita el {}. ;) – hometoast

+0

porque soy flojo cuando quiero agregar otra línea. – hometoast

5

En una nota aparte, esta implementación particular, mientras que va a trabajar (con las modificaciones sugeridas por las otras respuestas), es absolutamente un impacto en el rendimiento, ya que la complejidad de su el algoritmo es O (n^3).En otras palabras, estás atravesando el chequeo más interno mil veces.

Aquí hay una pista de cómo se puede optimizar a al menos O (n^2) o sólo uno milion iteraciones: para cada par de un y b generada por los dos exteriores para los bucles, sólo hay un valor para c que dará como resultado 1000.

+0

También vale la pena señalar que si a + b + c = 1000, entonces b + a + c también es igual a 1000. Por lo tanto, probablemente pueda cortar una gran cantidad de valores solo buscando valores de b que sean> = a. – Kibbee

+0

Lol, no quería darle todos los consejos, solo para mover su mente en la dirección correcta ... :-) –

2

La pregunta no especifica que los números negativos no están permitidos. La respuesta es infinita.

0

Prueba esto:

{ 
    for(a=0;a<=500;a++) 
    { 
     for (b=a;b<=500;b++) 
     { 
      c=1000-(a+b); 
      count 
Cuestiones relacionadas