Question: I have an `int[]` array with x values (x can be defined by the user), the values are random ints between 1 and 9. Now I want to create another Array with the same amount of values, and each value of the new Array is the product of all values from the other Array, except the same index.

So for example: 

* Array1: `{4,3,5,7}`
* Array2: `{3*5*7, 4*5*7, 4*3*7, 4*3*5} = {105, 140, 84, 60}`

Here's what I have:

```
public static int[] multiplyArrayValues (int [] values) {

    int array[] = new int[values.length];

    for (int y = 0; y < array.length; y++) {
        array[y] = 1;
    }

    /*for (int i = 0; i < array.length; i++) {      // wrong                        
        for (int z = 0; z < x; z++) {                           
            if (z != i) {                                                   
                array[i] = array[i] * values[z];                                        
            }               
        }           
    }*/

    return array;
}  

```

The difficulty is, I have to avoid for-loops in for-loops for performance. Which is why that one block is commented-out. Dividing is not allowed.

Answer: 
That's more a question about the algorithm to use. You can multiply all the numbers of the original array, lets call this `p`. Now the number at position `i` in the new array is `p / values[i]`.

If you must not use division, you can set up two temporary arrays, one contains the product of the values with smaller or equal index, the other the product of the values with larger or equal index.

```
s[i] = product of v[j] where j <= i
l[i] = product of v[j] where j >= i

```

both arrays can be set up with a simple loop each.

Now you can calculate `array[i]` as `s[i-1] * l[i+1]`, taking special care of the border values. This needs also just a simple loop.

Using these ideas and doing some optimizations leads to the following code

```
public static int[] multiplyArrayValues (int [] values) {
    int[] a = new int[values.length];
    int p = 1;
    for (int i = values.length - 1; i >= 0; i--) {
        a[i] = p;
        p *= values[i];
    }
    p = 1;
    for (int i = 0; i < values.length; i++) {
        a[i] *= p;
        p *= values[i];
    }
    return a;
}

```
First multiply all the elements from the array. And then loop over all elements and divide the previously computed multiplication with current item.