プログラミング練習2:配列積
1376 ワード
配列積(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)であった.
コード:
まとめ:
1.配列のサイズが不明な場合は、1次元配列を動的に宣言する必要があります.宣言形式は次のとおりです.
int* a = new int[n];
配列の使用が完了したら、次の操作を行います.
delete []a;
メモリ容量の解放
入力:長さ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;
メモリ容量の解放