2013-10-05 6 views
0

У меня есть вопрос о методе и способе поиска этих сгенерированных массивов. В основном я хочу создать массив из [a, b, c, (a + b + c)], а также второй массив из [d, e, f, (d + e + f)] и если третий элемент в массиве 1 и 2 одинаковый, отображает массивы на строки.Поиск вложенного цикла и конкретного элемента массива

int num = 10; 
for(int a = 0; a < num; a++){ 
    for(int b = 0; b < num; b++){ 
     for(int c = 0; c < num; c++){ 
     if(a<=b && b<=c){ 
      arrayOne[0] = a; 
      arrayOne[1] = b; 
      arrayOne[2] = c; 
      arrayOne[3] = (a+b+c); 
     } 
     } 
    } 
} 

for(int d = 0; d < num; e++){ 
    for(int e = 0; e < num; e++){ 
     for(int f = 0; f < num; f++){ 
     if(d<=e && e<=f){ 
      arrayTwo[0] = d; 
      arrayTwo[1] = e; 
      arrayTwo[2] = f; 
      arrayTwo[3] = (f -(d+e)); 
     } 
     } 
    } 
} 

, как вы можете видеть, что я за stump.I я не совсем уверен, где я могу получить каждую итерацию массивов и сравнить значения путем сопоставления сумм в каждом массиве и а также отображение соответствующего массива они находятся в. Спасибо всем в продвинутом.

+0

Можете ли вы привести пример того, как вы хотите, чтобы массивы выглядели? Прямо сейчас, похоже, у вас есть два массива длиной 4, и вы просто многократно перезаписываете значения, не используя их. – Maria

+1

прямо сейчас вы зацикливаетесь над своими 'a, b, c' независимо, а затем перебираете' d, e, f'. К тому времени, когда первые вложенные 'for' заканчиваются, у вас есть' [num, num, num, 3 * num] 'как ваш массив. В принципе, каждая итерация второго цикла генерирует те же данные, что и соответствующая итерация первых циклов, - и вложенный цикл будет выходить с тем же значением. Не знаете, чего вы пытаетесь достичь? – Floris

+0

Я пытаюсь создать два массива в свои разные времена выполнения, и в конце концов я хочу отсканировать все массивы, которые я создал, если и только если оба элемента arrayOne и arrayTwo имеют одну и ту же сумму в третьем элементе каждого массива, а затем отображение уважаемых массивов – Mario

ответ

1

Если я правильно понял ваш вопрос, если a=1, b=3, c=4 и d=2, e=3, f=3 вы хотели бы напечатать что-то по линиям 1 + 3 + 4 = 8 = 2 + 3 + 3. Во-первых, то, что вы делаете прямо сейчас, - это создание двух массивов, таких как Флорис, описанных в комментарии. То, что вы хотите сделать, это сохранить все значения в одном массиве массивов следующим образом:

int max; \\ To determine the value of max see the edit below. 
int array[][] = new int[max][num]; 
int index = 0; 
for (int a=0; a < num; a++) { 
    for (int b=a; b < num; b++) { 
     for (int c=b; c < num; c++) { 
      array[index][0] = a; 
      array[index][1] = b; 
      array[index][2] = c; 
      array[index][3] = a + b + c; 
      index++; 
     } 
    } 
} 

for (int i = 0; i < max; i++) { 
    for (int j = i; j < max; j++) { 
     if (array[i][3] == array[j][3]) { 
      string outString = array[i][0] + " + " + array[i][1] + " + " + array[i][2] + " = " + array[i][3] + " = " + array[j][0] + " + " + array[j][1] + " + " + array[i][2]; 
      System.out.println(outString); 
     } 
    } 
} 

Вы можете видеть, что я улучшил производительность, начиная b от a и c от b, так как вы выплеснуть все значения где b < a или c < b. Это также должно устранить необходимость в вашем заявлении if (я говорю, должен только потому, что я не проверял это). Мне нужно было использовать независимый индекс из-за сложностей тройного вложенного цикла.

Редактировать 2: Игнорировать меня. Я неправильно сделал комбинаторики. Пусть An,k - количество неупорядоченных множеств длины k, имеющих элементы в [n] (это позволит достичь того, чего вы желаете). Затем An,k = An-1,k + An,k-1. Мы знаем, что An, 1 = n (поскольку значения равны 0, 1, 2, 3, 4, ..., n) и A1,n = 1 (так как единственное значение может быть 11111 ... 1 n раз). В этом случае мы заинтересованы в n= num и k = 3, так затыкать в значениях мы получаем

A_num,3 = A_num-1,3 + A_num,2 

Применить уравнение рекурсивно, пока не пришел к ответу. Например, если указать номер 5:

A_5,3 = A_4,3 + A_5,2 
     = A_3,3 + A_4,2 + A_4,2 + A_5,1 
     = A_3,3 + 2(A_4,2) + 5 
     = A_2,3 + A_3,2 + 2(A_3,2) + 2(A_4,1) + 5 
     = A_2,3 + 3(A_3,2) + 2(4) + 5 
     = A_1,3 + A_2,2 + 3(A_2,2) + 3(A_3,1) + 2(4) + 5 
     = 1 + 4(A_2,2) + 3(3) + 2(4) + 5 
     = 1 + 4(A_1,2) + 4(A_2,1) + 3(3) + 2(4) + 5 
     = 1 + 4(1) + 4(2) + 3(3) + 2(4) + 5 
     = 5(1) + 4(2) + 3(3) + 2(4) + 5 

Похоже, это может упростить (num + (num - 1)(2) + (num - 2)(3) + ... + (2)(num - 1) + num), который binomial(num, num), но я не сделал работу, чтобы сказать наверняка.

+0

Я знаю, что конкатенация строк довольно грязная.Вы можете изменить это на что-то еще, если хотите. – Maria

+0

'if condition' во втором цикле' for' должно содержать '==', а не '=' Я предполагаю, хотя никогда не тестировал его, но все же это назначение, когда вам нужно сравнить два значения :-) +1 для остальных, хотя вопрос все еще немного неясен для меня. –

+0

Спасибо @nIcEcOw! Я внес изменения в соответствии с вашей коррекцией :) – Maria

1
int givenNumber = 10; 
int []arrayOne = new int [4]; 
int []arrayTwo = new int [4]; 
int count = 0; 

for (int i = 0; i < givenNumber; i ++) 
{  
    for (int x = 0; x < givenNumber; x ++) 
    { 
     for (int a = 0; a < givenNumber; a++){ 
      arrayOne[0] = (int)(a * java.lang.Math.random() + x); 
      arrayOne[1] = (int)(a * java.lang.Math.random() + x); 
      arrayOne[2] = (int)(a * java.lang.Math.random() + x); 
      arrayOne[3] = (int)(arrayOne[0]+arrayOne[1]+arrayOne[2]); 
     } 

     for (int b = 0; b < givenNumber; b++){ 
      arrayTwo[0] = (int)(b * java.lang.Math.random() + x); 
      arrayTwo[1] = (int)(b * java.lang.Math.random() + x); 
      arrayTwo[2] = (int)(b * java.lang.Math.random() + x); 
      arrayTwo[3] = (int)(arrayTwo[0]+arrayTwo[1]+arrayTwo[2]); 
     } 


     if (arrayOne[3] == arrayTwo[3]) 
     { 
      for (int a = 0; a < 2; a++) 
      { 
       System.out.print(arrayOne[a] + " + "); 
      } System.out.print(arrayOne[2] + " = " + arrayOne[3] + " = "); 

      for (int a = 0; a < 2; a++) 
      { 
       System.out.print(arrayTwo[a] + " + "); 
      } System.out.print(arrayTwo[2]);  

      System.out.println("\n"); 
      count += 1; 
     } 
    } 

} 
     if (count == 0) 
      System.out.println(
       "\nOops! you dont have a match...\n" + 
        "Please try running the program again.\n"); 
+0

Хорошо, это похоже на работу, но я хотел бы изменить математические операции. arrayOne [3] = (long) Math.pow (a, 5) + (long) Math.pow (b, 5) + (long) Math.pow (c, 5) arrayTwo [3] = (long) Math.pow (f, 5) - ((long) Math.pow (d, 5) + (long) Math.pow (e, 5)); – Mario

Смежные вопросы