除算なしで配列を構築する

497 ワード

配列a[N]を指定すると、b[j]=a[0]*a[1]...a[N-1]/a[j]の配列b[N]を構築することが望ましい.
O(1)空間複雑度とO(n)の時間複雑度が要求される.
カウンタとa[N]b[N]を巡回する以外に、新しい変数(スタック一時変数、スタック空間、グローバル静的変数などを含む)は使用できません.
考え方:まずb[i]にi以前の積を保持し、b[0]に最後から逐次の積を保存し、b[i]とb[0]の積がその位置の当然の値である.
void fun(int a[], int n)
{
	int *b = new int[n];
	b[0] = 1;
	for (int i = 1; i < n; i++)
	{
		b[i] = b[i-1]*a[i-1];
	}

	b[0] = a[n-1];
	for (int i = n-2; i > 0; i--)
	{
		b[i] *= b[0];
		b[0] *= a[i];
	}

	delete []b;
}