Нехай — вхідний масив, індексацію почнемо з . Тоді вхідні числа зберігаються в in[1], in[2], ..., in[n]. Якщо обчислити добуток усіх елементів масиву , а потім покласти out_i = p / in_i ( — результуючий масив), то такий метод не працює у випадку, коли in_i = 0.
Розглянемо інший підхід. Побудуємо два масиви:
Масив префіксних добутків , в якому
при цьому покладемо pref[0] = 1;
Масив суфіксних добутків , в якому
при цьому покладемо suf[n + 1] = 1;
Тоді out_i = pref[i - 1] \cdot suf[i + 1].
Приклад
Реалізація алгоритму
Оголосимо робочі масиви.
#define MAX 1000002
int in[MAX], pref[MAX], suf[MAX], res[MAX];Читаємо вхідні дані.
scanf("%d",&n);
for(i = 1; i <= n; i++)
scanf("%d",&in[i]); // [1,2,3,4]Будуємо масив добутків префіксів.
pref[0] = 1;
for(i = 1; i <= n; i++) // [1,2,6,24]
pref[i] = pref[i-1] * in[i];Будуємо масив добутків суфіксів.
suf[n+1] = 1;
for(i = n; i >= 1; i--) // [24,24,12,4]
suf[i] = suf[i+1] * in[i];Будуємо результуючий масив.
for(i = 1; i <= n; i++) // [24,12,8,6]
res[i] = pref[i-1] * suf[i+1];Виводимо відповідь.
for(i = 1; i <= n; i++)
printf("%d ",res[i]);
printf("\n");