2013-05-24 2 views
1

Это домашнее задание.Умножение массива в C++

Я пытаюсь умножать массив a и b вместе, используя эту формулу:

c[0]=a[0]*b[0]+a[0]*b[1]+a[0]*b[2]+....a[0]*b[n-1] 

c[1]=a[1]*b[1]+a[1]*b[2]+a[1]*b[3]+....a[1]*b[n-1] 

и так далее ...

Но этот код, кажется, работает только через a массив, но никогда через массив b. Результаты, которые я получаю, выглядят так:

6 
12 
18 
9 
6 
15 

Любые указатели были бы весьма благодарны.

Мой код -

#include <iostream> 

using namespace std; 
const int n=6; 
int main() 
{ 

int a[n]= {2,4,6,3,2,5}; 
int b[n]= {3,2,1,4,2,3}; 
int c[n]; 

for (int h=0; h<n; h++) 
{ 
    for (int g=0; g<n; g++) 
    { 
     c[h] = a[h]*b[g]; 
    } 
} 

for (int i=0; i<n; i++) 
{ 
    cout << c[i] << endl; 
} 
} 
+0

Вы просто делаете это неправильно. Вы пытаетесь сделать попарное умножение, умножение матрицы, точечный продукт ...? – djechlin

+0

он должен быть c [0] = 2 * 3 + 2 * 2 + 2 * 1 + 2 * 4 + 2 * 2 + 2 * 3 c [1] = 4 * 2 + 4 * 1 + 4 * 4 + 4 * 2 + 4 * 3 –

ответ

1
c[h] = a[h]*b[g]; 

Эта линия перекрывая значение c[h] для каждого значения b это только последнее значение (a[n - 1] * b[n - 1]) сохраняется. Вам нужно аккумулировать (добавить) значения от итерации свыше b, и вам нужно инициализировать c[h] заранее.

for (int g=0; g<n; g++) 

Это перебирает массив в весьb но ваш псевдокод показывает, что вы только хотите перебрать ч ... н.

Вот (правильно отступ!) Решение:

int main() { 
    int a[n] = {2, 4, 6, 3, 2, 5}; 
    int b[n] = {3, 2, 1, 4, 2, 3}; 
    int c[n] = {0}; 

    for (int h = 0; h < n; ++h) 
     for (int g = h; g < n; ++g) 
      c[h] += a[h] * b[g]; 

    for (int i = 0; i < n; ++i) 
     std::cout << c[i] << '\n'; 
} 
+0

Спасибо. Такая глупая ошибка, не замечающая, что g должна равняться h. –

0

вы пытаетесь получить каждый элемент в С массивом произведение каждого же элемент а и Ь массивы? если это так просто использовать C [0] = а [0] * б [0], с [1] = а [1] * б [1], и т.д.

0

Строка 16 должна быть:

c[h] = c[h] + a[h] * b[g]; 

Остальная часть кода выглядит нормально!

+0

Это приводит к смешным результатам, потому что 'c' никогда не инициализируется. –

+0

Я предположил, что c-массив будет инициализирован раньше. Создайте массив размером «n» и инициализируйте каждый элемент до 0, а затем загрузите элементы – Anshuman

2

Вы можете упростить задачу, сделав [I] общий фактор

Таким образом, вы получите

c[0] =a[0] *(b[0]+b[1]+b[2]+...+b[n-1]) 
c[1] =a[1] *(b[1]+b[2]+...+b[n-1]) 
c[n-1]=a[n-1]*(b[n-1]) 

так что O(n) решение будет:

int sumB = 0;   
for (int i=n-1; i >= 0; --i){ 
    sumB += b[i]; 
    c[i] = a[i] * sumB; 
} 
+0

+1, но теперь для дополнительных точек коричневого цвета реорганизуйте его вместо алгоритма C++, а не первого цикла. –

+0

сделано. Все сделано аккуратно в 1 петле –

+0

Не то, что я имел в виду, но даже лучше. –

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