Given an array of integers, create another array whose i‘th element contain the product of all the elements in original array except the i’th element in original array.

**Method-1 (Wrong): b[i] = product / a[i]**

The first attempt to answer this question is generally to take product of all the numbers and then divide the product by a[i] to get b[i].

void multiplyMat(int* a, int* b, int n) { int prod = 1; for(int i=0;i<n;i++){ prod *= a[i]; } for(int i=0;i<n;i++){ b[i] = prod/a[i]; } }

Try running this code for {0, 1, 2, 3, 4} and the code will crash at run-time (because of division by zero – a[0] is zerp, when the below statement is executed inside the for loop,

b[0] = prod/a[0];

It will crash. So, change the code to:

if(a[i] != 0) b[i] = prod / a[i];

**Method-2 (Without using division operator).**

The interviewer may ask you write code without using division operator and it should still take O(n) time and constant extra space.Here is the solution:

**Algorithm:**

1. Set all the elements in array b such that b[i] = b[i-1] * a[i]. 2. prod = 1; 3. for(i=n-1; i>0; i++) b[i] = b[i-1] * prod; prod = prod * a[i];

**Code:**

/** * i'th element of b will be product of all the elements of a except a[i] * a - Input Array * b - Result Array * n - Size of both the arrays */ void multiplyMat(int* a, int* b, int n) { b[0] = a[0]; for(int i=1;i<n-1;i++){ b[i] = b[i-1] * a[i]; } int prod = 1; for(int i=n-1; i>0; i--){ b[i] = b[i-1] * prod; prod *= a[i]; } b[0] = prod; }

I think this should also work!!!

void multiplyMat(int* a, int* b, int n)

{

for(int i=0;i<n;i++){

for(int j=0; j<n; j++){

if (i != j)

b[i] *= a[j];

}

}

}