数组元素的值为其他所有元素的累积

题目:一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的各个元素,即a[0]变为a[1]到a[n-1]的积,a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积(就是除掉当前元素,其他所有元素的积)。

要求:具有线性复杂度,且不能使用除法运算符。

答:

#include "stdafx.h"
#include <iostream>

using namespace std;

void PrintArray(int *a, int length)
{
    for (int i = 0; i < length; i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

//数组元素的值为其他所有元素的累积
void UpdateArrayNumber(int *a, int length)
{
    if (NULL == a || length <= 0)
    {
        return;
    }
    int *accumulate = new int[length];
    accumulate[0] = 1;
    for (int i = 1; i < length; i++)
    {
        accumulate[i] = a[i - 1] * accumulate[i - 1];
    }

    int tmp = 1;
    for (int i = length - 2; i >= 0; i--)
    {
        tmp *= a[i + 1];
        accumulate[i] *= tmp;
    }

    for (int i = 0; i < length; i++)
    {
        a[i] = accumulate[i];
    }

    delete [] accumulate;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int length = sizeof(a)/sizeof(a[0]);
    cout<<"before: ";
    PrintArray(a, length);
    UpdateArrayNumber(a, length);
    cout<<"after:  ";
    PrintArray(a, length);

    cout<<endl;
    return 0;
}

运行界面如下:

原文地址:https://www.cnblogs.com/venow/p/2673767.html