2012-12-26 19 views
5

Ciao a tutti e Buon Natale per il ppl che celebra oggi.
Ho un problema e forse qualcuno può aiutarmi.
Ho una casella di riepilogo in cui gli utenti possono immettere numeri decimali.
consente di dire che ti entrano 5 numeri:calcola (complicata) serie di numeri decimali in C#

1.1 
1.2 
1.3 
1.4 
1.5 

ho bisogno di ottenere la somma di tutte le variazioni di questi 5 numeri. Ad esempio somma di 1.1 and 1.2 quindi 1.1 1.2 1.3 quindi 1.1 1.2 1.3 1.4, quindi 1.2 1.4 1.5 quindi 1.1 1.3 1.5.
ho iniziato qualcosa, ma che passa attraverso tutte le variazioni solo saltare un numero alla volta:

List<Double[]> listNumber = new List<double[]>();    
Double[] array;    
for (int i = 0; i < listBox1.Items.Count; i++) 
{ 
    array = new Double[listBox1.Items.Count];     
    for (int k = 0; k < listBox1.Items.Count; k++) 
    { 
     if (!k.Equals(i)) 
     { 
      array[k] = (Convert.ToDouble(listBox1.Items[k]));      
     } 
    } 
    listNumber.Add(array); 
} 

ho bisogno di trovare un modo per calcolare il modo in cui voglio, se qualcuno mi può dare un'idea Sime lo farà essere grande regalo di Natale :) Grazie in anticipo, Laziale

+0

questo è un compito a casa ..? – MethodMan

risposta

1

Nel tuo tentativo iniziale, il tuo codice calcola solo la somma di tutte le coppie possibili. Dalla tua descrizione, vuoi anche trovare la somma di tre numeri, ecc.

Se ci sono sempre 5 numeri decimali, allora puoi semplicemente avere 5 cicli per. Tuttavia un design più generico sarebbe più pulito

double[] input = double[5]; //Pretend the user has entered these 
int[] counters = int[input.Length]; //One for each "dimension" 
List<double> sums = new List<double>(); 

for (int i = 0; i < counters.Length; i++) 
    counters[i] = -1; //The -1 value allows the process to begin with sum of single digits, then pairs, etc.. 

while (true) 
{ 
    double thisSum = 0; 
    //Apply counters 
    for (int i = 0; i < counters.Length; i++) 
    { 
     if (counters[i] == -1) continue; 

     thisSum += input[counters[i]]; 
    } 

    //Increment counters 
    counters[0]++; //Increment at base 
    for (int i = 0; i < counters.Length; i++) 
    { 
     if (counters[i] >= counters.Length) 
     { 
      if (i == counters.Length - 1) //Check if this is the last dimension 
       return sums; //Exhausted all possible combinations 

      counters[i] = 0; 
      counters[i+1]++; 
     } 
     else 
      break; 
    } 
} 

Qui è senza alcun codice per evitare l'aggiunta dello stesso numero due volte (vi svelo si tenta di finire quello fuori.SUGGERIMENTO: Si può semplicemente farlo dopo la sezione contatori di incremento, contenente una sezione "Incremento contatori" e il nuovo "Check contatori" sezione all'interno di un ciclo while, rompendo fuori del ciclo, mentre quando i contatori sono uniche ...

NOTA: non ho ancora testato questo codice, ma sarà essere vicino, e probabilmente avrà uno o due bug in esso - fatemi sapere se avete bisogno di aiuto con gli insetti.

0

Mentre io non sono molto esperto in C#, sono positivamente sicuro che c'è un modo molto più semplice di fare quello che si vuole fare; a meno che, ovviamente, mi manchi qualcosa.

Perché non creare un ciclo for per ogni elemento nell'elenco o matrice e quindi dirgli di saltare se stesso. Esempio:

Double[] array = new Double[3]; 
array[0] = 1,1; 
array[1] = 1,2; 
array[2] = 1,3; 

Double sum = 0; 

for (int i = 0; i < array.Length ; i++) 
{ 
    for (int x = 0 ; x < array.Length ; x++) { 
     if (array[i] != array[x]) 
     { 
      sum = array[x] + array[x+1] // or [x-1] depending on the value of x, you should be able to work this out. 
     } 
    } 
} 

Si dovrebbe essere in grado di capire quello che voglio dire esaminando questo esempio. Ovviamente, questo è un prototipo molto semplice, quello che farai è espanderlo per controllare all'indietro a seconda del valore di x, e avere più variabili "somma" per memorizzare le tue somme - a seconda del tipo di risultati che tu " sto cercando.

-Spero che questo aiuti, Buon Natale.

+0

Questo non offre tutte le possibilità. – kmkaplan

1

solo un contorno come io sono sul mio cellulare:

Inizia con la vostra lista di input e una lista di output che contiene uno zero.

Per ciascun numero nel proprio input, creare un nuovo elenco di doppi aggiungendo il numero di input corrente a ciascuno dei numeri nell'elenco di output corrente; quindi concatena questa lista alla fine dell'elenco di output.

Facoltativamente, rimuovere lo zero e la prima istanza di ciascuno dei numeri di ingresso, ed i duplicati:

Ad es per il tuo esempio fino a 1,4:

0 
0 1.1 
0 1.1 1.2 2.3 
0 1.1 1.2 2.3 1.3 2.4 2.5 3.6 
0 1.1 1.2 2.3 1.3 2.4 2.5 3.6 1.4 2.5 2.6 3.7 2.7 3.8 3.9 5.0 
     1.2 2.3  2.4 2.5 3.6   2.6 3.7 2.7 3.8 3.9 5.0      
0

Prendete il vostro listBox e, di fronte a ogni numero, sia mettere un 0 per indicare che essa non partecipare alla vostra somma o un 1 per indicare che sarà partecipare alla vostra somma. Con il vostro elenco esempio di 1.1, 1.2, 1.3, 1.4, 1.5 e le somme di 1.1, 1.2 quindi 1.1 1.2 1.3 quindi 1.1 1.2 1.3 1.4 quindi 1.2 1.4 1.5 allora 1.1 1.3 1.5 questo darebbe (Ho solo scrivere 1 s per chiarezza, gli spazi vuoti dire 0):

  |  |  | 1.1 |  | 
     |  | 1.1 | 1.2 | 1.2 | 1.1 
     |  | 1.2 | 1.3 | 1.4 | 1.3 
    1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.5 
---+-----+-----+-----+-----+-----+----- 
1.1| 1   1  1   1 
1.2|  1  1  1  1 
1.3|    1  1   1 
1.4|     1  1 
1.5|       1  1 

come si può vedere ora con una tale rappresentazione, elencando tutte le combinazioni di questi numeri è ora simile a contare in 0-31 (11111 in binario, 2⁵ - 1). Se non sei interessato alla sequenza vuota, inizia a contare da 1.

Ecco un esempio di codice per trasformare questo conteggio in un listNumber come vuoi. Per favore scusa la sintassi perché non conosco C#. Questo significa anche che questo è un codice non testato.

Double[] array = new Double[listBox1.Items.Count]; 
for (int i = 0; i < listBox1.Items.count; i++) 
    array[k] = Convert.ToDouble(listBox1.Items[i]); 
int count = 2^array.Items.Count; 
List<Double>[] listNumber = new List<Double>[count]; 
for (int i = 0; i < listNumber.Items.Count; i++) { 
    listNumber[i] = new List<Double>(); 
    for (j = 0; j < array.Items.Count) 
     if (i & (1 << j) != 0) 
      listNumber[i].Add(array[j]); 
}