2009-02-23 4 views
10

ho bisogno di creare un programma che calcola quanti modi è possibile aggiungere tre numeri in modo che essi sono pari a 1000.Calcolare quanti modi è possibile aggiungere tre numeri in modo che essi sono pari a 1.000

Credo che questo codice dovrebbe funzionare, ma non scrive nulla. Che cosa sto facendo di sbagliato? Qualche consiglio o soluzione?

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

Qual è l'anello più interno per? – Juliet

+0

Ecco come dovrebbe essere posta una domanda sui compiti. :-) –

+0

Due pollici in su per essere onesti che si tratta di un compito a casa. :) –

risposta

16

tuo ciclo più interno (l'iterazione della variabile puls) in realtà non ha alcun senso, ed a causa della condizione su di esso (puls < 1000) Console.WriteLine mai corre.

Forse dovresti verificare se A + B + C è 1000, invece.

Inoltre, troverete che si potrebbe mancare un paio particolari combinazioni di numeri a causa dei limiti sui vostri loop (a seconda della dichiarazione del problema.)

+0

+1 per aiutare ma non fare i compiti per lui. –

+0

Grazie! Ho provato a esprimere la mia risposta pensierosamente. – mquander

+0

OK, morderò, quali combinazioni mancano? Sto assumendo solo numeri interi positivi per A, B e C. –

1

Non è necessario il ciclo interno.

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

Una volta che il ciclo interno più arriva al 1000, si rompe fuori del ciclo for e mai controlli anche se è 1000 nel 'se' dichiarazione.

0

Questo codice non restituirà alcuna risposta.

L'interno per loop aggiunge a + b + c e inserisce il risultato in puls. Tuttavia, si interrompe il ciclo prima che il puls possa arrivare a 1000, quindi si esegue il test all'interno dell'istruzione for per verificare se il puls è uguale a 1000. Pertanto, non si otterrà una risposta.

Basta pulsare di prova contro 1000 nel loop interno. Perché?

0

È possibile sostituire il ciclo più interno con un solo test per if (a + b + c == 1000) {...}. Quindi è possibile aggiungere ottimizzazioni come: una volta trovata una somma con una combinazione, non è necessario continuare con il ciclo interno.

1

Nel proprio ciclo interno "int puls = a + b + c; puls < 1000; puls ++" si sta verificando che puls = 1000, se puls non è inferiore a 1000, esce dal ciclo . Questo è il motivo per cui ottieni i valori no. Ma ripensa anche la tua logica.

0

Il codice non copre i seguenti casi

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

Il più ciclo interno dovrebbe essere un se piuttosto per.

Non è necessario {} se è presente una sola istruzione nel ciclo o nella clausola if.

EDIT: codice Rimosso risponde

+0

Per favore, oh per favore, non omettere il {}. ;) – hometoast

+0

perché sono pigro quando voglio aggiungere un'altra linea. – hometoast

5

In una nota separata, questa particolare implementazione, mentre funzionerà (con le modifiche suggerite dalle altre risposte), è piuttosto un calo di prestazioni, come la complessità del l'algoritmo è O (n^3).In altre parole, stai attraversando il controllo più interno di un bilione di volte.

Ecco un suggerimento come è possibile ottimizzare ad almeno O (n^2) o solo un milione iterazioni: per ogni coppia di un e b generato dai due esterni cicli for, c'è un solo valore per c che si tradurrà in 1000.

+0

Vale anche la pena notare che se a + b + c = 1000, allora b + a + c equivale anche a 1000. Quindi probabilmente puoi ritagliare molti valori controllando solo i valori di b che sono> = a. – Kibbee

+0

Lol, non volevo dargli tutti i suggerimenti, solo per spingere la sua mente nella giusta direzione ... :-) –

1

Se si ottiene questo compito come studente di informatica, è probabile che si desideri risolvere questo problema utilizzando Dynamic Programming.

2

Domanda non specifica che i numeri negativi non sono consentiti. La risposta è infinita.

0

Prova questo:

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