题目:一个长度为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]; //accumlate[i]= a[0]*a[1]*...*a[i-1] } int tmp = 1; for (int i = length - 2; i >= 0; i--) { tmp *= a[i + 1]; //temp= a[n]*a[n-1]*...a[i+1] accumulate[i] *= tmp; //accumulate[i] = a[0]*a[1]*...*a[n]/a[i] } 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; }
运行界面如下: