プログラミング練習2:配列積


配列積(2012,小米、捜犬、テンセント)
入力:長さnの整数配列input
出力:長さnの整数配列resultで、result[i]=input配列のinput[i]以外のすべての数の積を満たす(オーバーフローしないと仮定).たとえば、input={60,40,30,24}と入力します.
プログラム要件:線形複雑度があり、除算演算子は使用できません.
C/C++:
int  *cal(int * input,int n)
考え方:
left[i]はinput[i]の前のすべての要素の積を格納し、right[i]はinput[i]の後のすべての要素の積を格納し、result[i]=left[i]*right[i]となる.
left[i]の計算は左から右へ要素を繰り返し、right[i]の計算は右から左へ要素を繰り返します.時間的複雑度はO(n),空間的複雑度はO(n)であった.
コード:
#include 
using namespace std;

int *cal(int* input,int n)	//      O(n),      O(n)
{
	int i;
	int *left = new int[n];	//  input[i]         
	int *right = new int[n];	//  input[i]         
	int *result = new int[n];	
	left[0]=1;
	right[n-1]=1;
	for(i=1;i=0;i--)
		right[i] = right[i+1]*input[i+1];
	for(i=0;i0;i--)
	{
		result[i] *= result[0];
		result[0] *= input[i];
	}
	return result;
}

int main()
{
	int n,i;
	cin>>n;
	int *input = new int[n];
	int *result1 = new int[n];
	int *result2 = new int[n];
	for(i=0;i>input[i];

	result1=cal(input,n);
	result2=cal2(input,n);
	for(i=0;i

まとめ:
1.配列のサイズが不明な場合は、1次元配列を動的に宣言する必要があります.宣言形式は次のとおりです.
int* a = new int[n];
配列の使用が完了したら、次の操作を行います.
delete []a;
メモリ容量の解放