2012-01-09 4 views
3

Привет, У меня есть массив: int [] num = new int[6]{1,2,2,1,1,2};Умножение элементов в массиве

Я хочу, чтобы умножить значение в элементе 0 с любым другим значением, я тогда нужно умножить значение в элементе 1 со значениями в элементах 2 до последнего элемента. Затем умножьте значение на элемент 2 со значениями от 3 до конца и так далее, пока я не повторю все массивы.

Мои усилия до сих пор кажутся неуклюжими и многословными, поэтому мне было интересно, сможет ли кто-нибудь показать мне элегантный способ достижения моей цели.

Большое спасибо.

+3

Как выглядят «неуклюжие и многословные» попытки? вы должны опубликовать их. – Alex

+2

* Неуклюжие и подробные * усилия обеспечивают удовольствие от чтения :) Пожалуйста, напишите что-нибудь, и мы поможем вам сделать его изящным. – dasblinkenlight

+1

Важно знать, что продукты могут стать ОЧЕНЬ большими, и вы можете потерять согласованность данных с вашим массивом int. Возможна ли эта проблема в вашем сценарии? –

ответ

8

Вы можете пройти через массив назад и сделать это за один проход, а не повторять операции.

for (int i = num.Length - 2; i >= 0; i--) 
{ 
    num[i] *= num[i + 1]; 
} 

Дает 8,8,4,2,2,2

+1

+1 Ровно! Гораздо быстрее для больших массивов. O (n) против O (n^2) в качестве других ответов. –

+0

Огромное спасибо всем, кто ответил. – user995689

+0

+1 Вот что я тоже подумал. –

1

Это должно сделать работу:

2
Enumerable.Range(0,num.Length) 
    .Select(i => num.Skip(i).Aggregate(1, (a, b) => a * b)) 

дает последовательность 8, 8, 4, 2, 2, 2. Является ли это то, что вы имели в виду?

+1

Это очень медленный O (n^2). Однако, если бы существовал метод «сползания» (как «List.foldBack»), тогда это можно было сделать довольно быстро и быстро. –

+2

Да. Рэй получил мое преимущество! OTOH Я бы не ожидал, что агрегатное умножение будет выполнено на слишком многих элементах, так как стало бы легко переполняться. – spender

0

INT [] Num = новый INT [6] {1, 2, 2, 1, 1, 2};

 int i = 0; 

     while (i < num.Length) 

     { 
      for (int j = i; j < num.Length;j++) 

      { 

       if((j+1)<num.Length) 

       num[i] = num[i] + num[j + 1]; 

      } 

      Console.WriteLine(num[i]); 

      i++; 

     } 
+0

Вы понимаете, что добавляет не кратность? И как только фиксированный функционально идентичен другому ответу? – Ray

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