2012-12-26 18 views
5

こんにちはみんなとメリークリスマスのpplのために今日祝う。
私は問題があり、多分誰かが私を助けることができます。
ユーザーが10進数を入力できるリストボックスがあります。私は、これらの5つの数字のすべてのバリエーションの合計を取得する必要がありCでの(複雑な)10進数の配列を計算する

1.1 
1.2 
1.3 
1.4 
1.5 


は、彼らは5つの数字を入力しますと言うことができます。 例えば、1.1 and 1.2の合計、1.1 1.2 1.3、次に1.1 1.2 1.3 1.4、次に1.2 1.4 1.5、次に1.1 1.3 1.5の合計。
私は一度に一つの番号をスキップすべてのバリエーションを経由することなく、何かを開始しました:

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); 
} 

私は誰もが私にサイムアイデアを与えることができれば、それは意志、私が望むように計算する方法を方法を見つける必要があります偉大なクリスマスの贈り物になる:) 事前に感謝、Laziale

+0

これは宿題です。 – MethodMan

答えて

1

最初の試みでは、あなたのコードはすべての可能な組み合わせの合計を計算します。あなたの説明から、あなたは3つの数字の合計などを見つけたいと思っています。

いつも5つの10進数があれば、単にforループを持つことができます。しかし、より一般的なデザインは、それが二度同じ数の追加を回避するための任意のコードなしでここクリーナー

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; 
    } 
} 

になり(私はあなたがそれを終えるしてみましょうよ。ヒント:カウンターがユニークなときにwhileループの外側に壊れて、whileループ内の "Increment Counters"セクションと新しい "Check Counters"セクションの両方を含むインクリメントカウンターセクションの後に単純に行うことができます。

注:私はこのコードをテストしていませんが、近いかもしれませんし、おそらく1〜2つのバグがあります。

0

私はC#に堪能ではないが、私は確かにあなたがやりたいことをやるより簡単な方法があると確信している。もちろん、私は何かが欠けている。

リストまたは配列内のすべての要素に対してforループを作成し、それをスキップするようにしてください。 例:

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. 
     } 
    } 
} 

あなたは、私がこの例を調べることによって、意味を理解することができるはずです。 もちろん、これは非常に基本的なプロトタイプです。これを展開してxの値に応じて後方にチェックし、合計を格納する複数の "合計"変数を持つようにします。結果の種類に応じて、再探しています。

- これがメリークリスマスに役立つことを願っています。私は自分の携帯電話上だとして

+0

これはすべての可能性を示しているわけではありません。 – kmkaplan

1

ジャスト概要:

ご入力リストで始まり、ゼロが含まれ、出力リスト。

入力の各番号について、現在の出力リストの各番号に現在の入力番号を追加して新しいリストを作成します。このリストを出力リストの最後に連結します。

任意選択的に、零入力番号のそれぞれの最初のインスタンス、及び任意の重複を削除:

例えばあなたの例では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

はあなたのlistBox取ると、各番号の前に、どちらかそれはそれはあなたの合計に参加することを示すために、あなたの和または1に参加しないだろうことを示すために0を置きます。その後、あなたの例の1.1のリスト、1.21.31.41.51.1の合計、1.2その後、1.1 1.2 1.3その後、1.1 1.2 1.3 1.41.2 1.4 1.5その後、1.1 1.3 1.5これはあなたを与えるだろう(私は明確にするため1 Sを書き、空のスペースが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 

あなたは今、このような表現と見ることができるように は、(バイナリで11111、2⁵ - 1)31まで0から数えると今と似ています。空のシーケンスに興味がない場合は、1からカウントを開始してください。

ここでは、このカウントを希望するようにlistNumberに変換するサンプルコードを示します。私がC#を知らないので、構文を許してください。これは、これが未テストのコードであることも意味します。

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]); 
}