2012-12-26 34 views
5

Xin chào tất cả mọi người và Giáng sinh vui vẻ cho ppl ăn mừng ngày hôm nay.
Tôi gặp sự cố và có thể ai đó có thể giúp tôi.
Tôi có một hộp danh sách để người dùng có thể nhập số thập phân.
phép nói rằng họ sẽ nhập 5 số:tính toán (phức tạp) mảng của các số thập phân trong C#

1.1 
1.2 
1.3 
1.4 
1.5 

tôi cần để có được tổng của tất cả các biến thể trong những 5 số. Ví dụ: số tiền là 1.1 and 1.2 rồi 1.1 1.2 1.3 rồi 1.1 1.2 1.3 1.4, sau đó 1.2 1.4 1.5 rồi 1.1 1.3 1.5.
tôi bắt đầu một cái gì đó nhưng mà đi qua tất cả các biến thể chỉ bỏ qua một số tại một thời điểm:

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

tôi cần phải tìm ra cách làm thế nào để tính toán theo cách tôi muốn, nếu có ai có thể cho tôi ý tưởng sime nó sẽ là món quà Giáng sinh tuyệt vời :) Cảm ơn trước, Laziale

+0

đây có phải là bài tập về nhà không ..? – MethodMan

Trả lời

1

Trong lần thử đầu tiên, mã của bạn chỉ tính tổng của tất cả các cặp có thể. Từ mô tả, bạn cũng muốn tìm tổng của ba số, v.v.

Nếu luôn có 5 số thập phân, thì bạn có thể chỉ có 5 số cho vòng lặp. Tuy nhiên, một thiết kế chung chung hơn sẽ sạch hơn

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

Ở đây không có mã nào để tránh bổ sung cùng một số hai lần (Tôi sẽ để bạn thử hoàn thành việc đó.GỢI Ý: Bạn chỉ có thể làm như vậy sau phần bộ đếm gia tăng, chứa cả phần "Bộ đếm gia tăng" và phần "Bộ đếm kiểm tra" mới bên trong một vòng lặp while, phá vỡ bên ngoài vòng lặp trong khi các bộ đếm là duy nhất ...

LƯU Ý: Tôi chưa thử nghiệm mã này, nhưng nó sẽ ở gần và có khả năng sẽ có một hoặc hai lỗi trong đó - hãy cho tôi biết nếu bạn cần bất kỳ trợ giúp nào về các lỗi này.

0

Mặc dù tôi không thành thạo về C#, tôi chắc chắn có một cách đơn giản hơn để làm những gì bạn muốn làm; trừ khi tất nhiên, tôi đang thiếu một cái gì đó.

Tại sao không tạo vòng lặp for cho mọi phần tử trong Danh sách hoặc Mảng, và sau đó yêu cầu nó bỏ qua chính nó. Ví dụ:

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

Bạn sẽ có thể hiểu ý tôi bằng cách kiểm tra ví dụ này. Tất nhiên, đây là một nguyên mẫu rất cơ bản, những gì bạn sẽ làm là mở rộng điều này để kiểm tra ngược tùy thuộc vào giá trị của x, và có nhiều biến "tổng" để lưu trữ số tiền của bạn - tùy thuộc vào loại kết quả bạn ' Đang tìm kiếm.

-Tôi hy vọng điều này sẽ giúp, Giáng sinh vui vẻ.

+0

Điều này không cung cấp tất cả các khả năng. – kmkaplan

1

Chỉ phác thảo như tôi đang ở trên điện thoại của mình:

Bắt đầu với danh sách đầu vào và danh sách đầu ra có chứa số không.

Đối với mỗi số trong đầu vào của bạn, hãy tạo danh sách tăng gấp đôi mới bằng cách thêm số đầu vào hiện tại vào từng số trong danh sách đầu ra hiện tại; sau đó ghép nối danh sách này vào cuối danh sách đầu ra.

Tùy chọn, xóa số không và trường hợp đầu tiên của từng số đầu vào và bất kỳ bản sao nào:

Ví dụ: cho ví dụ đầu vào của bạn lên đến 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

Hãy listBox của bạn và, ở phía trước của mỗi số, hoặc đặt một 0 để cho biết rằng nó sẽ không tham gia để tổng hợp hoặc một 1 của bạn để cho biết rằng nó sẽ tham gia để tổng hợp của bạn. Với danh sách của bạn ví dụ về 1.1, 1.2, 1.3, 1.4, 1.5 và số tiền của 1.1, 1.2 sau đó 1.1 1.2 1.3 sau đó 1.1 1.2 1.3 1.4 sau đó 1.2 1.4 1.5 sau đó 1.1 1.3 1.5 này sẽ cung cấp cho bạn (tôi chỉ viết 1 s cho rõ ràng, các khoảng trống có nghĩa 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 

Như bạn có thể thấy với đại diện như vậy, liệt kê tất cả các kết hợp của các số này bây giờ tương tự như đếm từ 0 đến 31 (11111 ở dạng nhị phân, 2⁵ - 1). Nếu bạn không quan tâm đến chuỗi rỗng, hãy bắt đầu đếm từ 1.

Đây là mã mẫu để chuyển số này thành số listNumber như bạn muốn. Xin vui lòng giải thích cú pháp như tôi không biết C#. Điều này cũng có nghĩa rằng đây là mã chưa được kiểm tra.

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]); 
} 
Các vấn đề liên quan