0

私はいくつかの値を持つ配列を持っています。

A=[a,b,c];

以下を計算するためのC ++で最も簡単/最速の方法は何ですか:

int SUM;
SUM= a*b + a*c + b*a + b*c + c*a + c*b;

この場合a*c != c*a

実際のケースでは、サイズの異なる大きな配列があり、他の配列から a、b、c の値を取得します。

/前もって感謝します

4

7 に答える 7

4

おそらくそうです(実際に a * b と b * a の両方を追加したいと仮定します):

for (int i = 0; i < array_size - 1; ++i) {
    for (int j = i + 1; j < array_size; ++j) {
        sum += a[i] * a[j] * 2;
    }
}

そして、アルゴリズムの複雑さ (O(n) 対 O(n*n)) を軽減するより賢いバージョンでさえあるかもしれません:

配列内の各メンバー a[x] について、合計します。

a[0] * a[x] + a[1] * a[x] + ... + a[n] * a[x] - a[x] * a[x]

共通因数を因数分解すると、次のようになります。

a[x] * (a[0] + a[1] + ... + a[n] - a[x])

これで、すべての配列項目の合計を 1 回だけ計算できます。

int array_sum = std::accumulate(a, a + array_size, 0);  //#include <numeric> or use a simple loop
int sum = 0;
for (int i = 0; i < array_size; ++i) {
    sum += a[i] * (array_sum - a[i]);
}
于 2010-02-09T12:29:50.400 に答える
2

コードを試してください:

int sum = 0;

for(int i=0 ; i < size ; i++)
{
    int tmp = 0;
    for(int j=0 ; j < size ; j++)
    {
          if( i != j )
             tmp += a[i] * a[j];
    }
    sum += tmp;
}
于 2010-02-09T11:55:25.587 に答える
2
int SUM = 0;
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i != j)  {
            SUM += A[i] * A[j];
        }
    }
}

ただし、 A が可変サイズでない限り、この式をそのまま書き留めた方がよい場合があります。

int SUM = A[0] * A[1] + ...;
于 2010-02-09T11:55:51.763 に答える
2

私が何かを見逃していない限り、それは次のように簡単なはずです:

int sum = 0;

for(unsigned int i = 0; i < ARRAYSIZE; i++){
    for(unsigned int j = 0; j < ARRAYSIZE; j++){
        if(i != j){
            sum += A[i] * A[j];
        }
    }
}
于 2010-02-09T11:59:10.387 に答える
1

Visitor によるコードは、さらに単純化できます。

const int array_sum( std::accumulate(a, a + array_size, 0) );
int sum( array_sum * array_sum );
for (int i = 0; i < array_size; ++i) {
    sum -= a[i] * a[i];
}

そして、一時的に使用できると思います:

const int array_sum( std::accumulate(a, a + array_size, 0) );
int sum( array_sum * array_sum );
for (int i = 0; i < array_size; ++i) {
    const int tmp( a[i] );
    sum -= tmp * tmp;
}

もちろん、二乗ステップは STL を使用して実行することもできます。

const int array_sum( std::accumulate(a, a + array_size, 0) );
std::transform( a, a + array_size, a, a, std::multiplies<int>() );  // store in a
const int sum( array_sum * array_sum - std::accumulate(a, a + array_size, 0) );

編集:単一のパスを持つ単純なループ:

int array_sum( 0 ), square_sum( 0 );
for( int i(0) ; i < array_size; ++i )
{
   int tmp(a[i]);
   array_sum += tmp;
   square_sum += tmp * tmp;
}
const int sum(  array_sum * array_sum - square_sum );
于 2010-02-09T13:17:52.690 に答える
0

これは、9 つ​​の if を 3 つの乗算と 3 つの減算と交換するソリューションです。

int sum = 0;
for (int i = 0; i < 3; ++i)
{
    for (int j = 0; j < 3; ++j)
    {
        sum += A[i] * A[j];
    }
    sum -= A[i] * A[i];
}
于 2010-02-09T12:29:18.200 に答える
0

より短いループを使用します。

int SUM = 0;
for (int i = 0; i < 2; i++) {
    for (int j = i+1; j < 3; j++) {
        SUM += A[i] * A[j];
        SUM += A[j] * A[i];
    }
}

これにより、if (i != j) チェックの必要性がなくなり、i++ と j++ および i<2 と j<3 の呼び出しが少なくなります。

于 2010-02-09T14:49:58.377 に答える