2012-12-26 4 views
5

안녕하세요 여러분과 메리 크리스마스 ppl 오늘 축하합니다.
문제가 생겼으며 누군가 나를 도울 수 있습니다.
사용자가 십진수를 입력 할 수있는 목록 상자가 있습니다. 나는 그 5 개 개의 번호의 모든 변화의 합계를 얻을 필요가C에서 십진수의 (복잡한) 배열을 계산하십시오.

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의 합.
는 그 그러나 뭔가 모든 변형 한 번에 하나 개의 번호를 건너 뛰는 통과 시작 :

나는 누군가가 나에게 SIME 아이디어를 줄 수 있다면 것, 어떻게 내가 원하는 방식으로 계산하는 방법을 찾을 필요가
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

귀하의 코드는 가능한 모든 쌍의 합계만을 계산합니다. 귀하의 설명에서 세 숫자의 합계 등을 찾고 싶을 수도 있습니다.

항상 5 자리 숫자가있는 경우 5 개의 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 루프 외부에서 깨는 간단한 작업을 수행하면됩니다.

참고 :이 코드를 테스트하지는 않았지만 가까운 위치에 버그가 하나 또는 두 개있을 수 있습니다. 버그에 대한 도움이 필요하면 알려주십시오.

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.2, 1.3, 1.4, 1.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의 쓰기, 빈 공간이 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]); 
} 
관련 문제