两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];
要求:
1.不准用除法运算
2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)
3.满足时间复杂度O(n),空间复杂度O(1)
#include <iostream>
using namespace std;#define N 4
/*
*总的思路如下:
* b[i] = (a[0]*a[1]*..a [i-1]) *(a[i+1]*...*a[n])
* 所以在不借助其他数组或者变量的情况下,先从左至右让b[i]存前半部分,在
* 从右至左让b[i]存后半部分。
*/
int main(void)
{
int a[4] ={2,4,5,8};
int b[4] ={1};
/*第一步:先从左到右进行遍历,即将b[i]的前半部分先计算出来
b[i]=a[0]*a[1]*a[2]*a[3]*a[i-1]=b[i-1]*a[i-1]
*/
for(int i=1; i<N; i++)
{
b[i]=b[i-1] * a[i-1];
}
/*第二步:先从右到左进行遍历,即将b[i]的后半部分算出来
*/
for(i=N-2; i>0; i--)
{
b[0]*=a[i+1];//用b[0]来保存后半部分的值
b[i]*=b[0];
}
b[0]*=a[1];//计算b[0]的值。
for(i=0; i<4; i++)
{
cout << b[i] <<" " << endl;
}
return 0;
}