数组乘积更新

/*
题目:
一个长度为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]的积。最后返回更新后数组的最大值。
程序要求:要求1.具有线性复杂度。2.不能使用除法运算符。
解法:更新后a[i] = (a[0]*...*a[i-1]) * (a[i+1]*...*a[n-1]),遍历得到前半部分和后半部分即可。
*/
#include <iostream>
#include <assert.h>
using namespace std;
const int num = 10;
const long init_min = -10000;

long UpdateArray(long *a, int n)
{
    long temp = init_min;
    long *ptr1 = new long[n];
    assert(ptr1 != NULL);
    long *ptr2 = new long[n];
    assert(ptr2 != NULL);
    int i;

    ptr1[0] = 1;
    ptr2[n-1] = 1;
    /*得到(a[0]*...*a[i-1])*/
    for(i=1; i<n; i++)
    {
        ptr1[i] = ptr1[i-1] * a[i-1];
    }
    /*得到(a[i+1]*...*a[n-1])*/
    for(i=n-2; i>=0; i--)
    {
        ptr2[i] = ptr2[i+1] * a[i+1];
    }
    for(i=0; i<n; i++)
    {
        a[i] = ptr1[i] * ptr2[i];
        if(a[i] > temp)
        {
            temp = a[i];
        }
    }
//    cout << *(ptr1+2) << endl;// *ptr equal to ptr[0] equal to *(ptr+0)
    delete []ptr1;
    delete []ptr2;

    return temp;
}

int main()
{
    long a[num] = {1,2,3,4,5,6,7,8,9,10};
    long MaxItem;

    MaxItem = UpdateArray(a, num);
    cout << "after updated, the max item is: " << MaxItem << endl;
    for(int i=0; i<num; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;

    return 0;
}
原文地址:https://www.cnblogs.com/buptmuye/p/3666592.html