Как мы можем перемножить каждый элемент массива друг на друга и сохранить значения каждого продукта в массиве на c ?

#c #arrays #multiplication

#c #массивы #умножение

Вопрос:

пример: допустим, у нас есть массив arr1 [1,2,3,4] , продукты будут 1×2, 1×3, 1×4, 2×1, 2×3, 2×4, 3×1, 3×2, 3×4, 4×1, 4x, 4×3. таким образом, новый массив будет похож на arr2 [2,3,4,2,6,8,3,6,12,4,8,12] . Я думал о том, чтобы пойти с :

 for( int i=0; i<n; i  ){
    for(int j=0; j<n; j  ){
       arr2[i]= arr1[j] * arr1[j 1];
    }
}
  

Но это только умножает последовательные элементы, а не все.
Может кто-нибудь рассказать мне логику / алгоритм?

Комментарии:

1. Похоже, вам нужны вложенные циклы. Также «цикл for с i= 0 до n и i {arr2[i]= arr1 [i] *arr[i 1]; }» Не было бы проще на самом деле показать цикл?

2. Ваш вопрос довольно неясен. Во-первых, вы смешиваете фактические требования и детали реализации. Если вам нужны только уникальные продукты, то действительно ли необходимо хранить их в массиве?

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

4. таким образом, конечным массивом будет arr2[2,3,4,6,8,12] . Сохраняя результаты умножения в a std::set , вы получите сортировку и удаление дубликатов бесплатно.

5. @PaulMcKenzie представьте мир, в котором новички изучают алгоритмы перед циклами, итераторы перед указателями, std::string перед c-строками,…..

Ответ №1:

Используйте if инструкцию, чтобы проверить это i != j перед выполнением умножения.

Вам также нужна другая переменная index для хранения индекса в выходном массиве, которую вы не можете использовать i для этого, поскольку она останавливается на n . Вы также не можете использовать i*n j , потому что пропускаете элементы (может существовать формула для нужного индекса, но использовать другую переменную проще).

 int k = 0;
for (int i = 0; i < n; i  ) {
    for (int j = 0; j < n; j  ) {
        if (i != j) {
            arr2[k  ] = arr1[i] * arr1[j];
        }
    }
}
  

Комментарии:

1. Я могу предоставить живую демонстрацию на coliru . Э, нет! Он по-прежнему удаляет дубликаты — извините. 😉

2. @Scheff честно говоря, удаление дубликатов после ввода каждой записи дважды — это немного…. глупо. Внутренний цикл должен начинаться с i 1 , хотя это не соответствовало бы обновленной цели

3. @idclev463035818 В вопросе говорится, что он хочет 2×1, поэтому внутренний цикл должен начинаться с 0

4. @idclev463035818 Должен признать, я бы не стал использовать это в производительном коде, если бы его можно было проследить до моего настоящего имени.

5. @Barmar Я все еще ссылаюсь на старый пост, на который также ссылается Шефф. Извините, я сейчас заткнусь: P