2017-12-20 3 views
0

私は以下のタスクを与えられています:実数の与えられた二重リンクリストでは、リストの反対の要素を乗算する必要があります、最後のマイナス1など)、この製品を新しいリストに追加します。 すなわち:我々はそのリストを持っている:C++の二重リンクリストの反対の要素のペアごとの乗算

1.1 2.2 3.3 4.4 5.5 

その後、我々は

1.1 * 5.5 = 6.05; 
2.2 * 4.4 = 9.68; 
3.3 * 3.3 = 10.89; 

を印刷し、最終的なリストは、次のとおりです。

:私は、次のナイーブアルゴリズムを作ってみた

6.05 9.68 10.89 

#include <iostream> 
#include <list> 

using namespace std; 

int main() { 
    double x = 0; 
    double q = 0; //for the product of the elements 
    list <double> user_values, calculated_products; 

    //data entry 
    while (cin >> x) { 
     user_values.push_back(x); 
     if (cin.get() == '\n') break; 
    } 

    //pairwise multiplication of the opposite elements (х1 * хn; x2 * xn-1; etc.): 
    for (auto p = user_values.begin(); p!=(user_values.end()); ++p){ 
     cout << (*p) << " * " << (*user_values.rbegin()) << " = " ; 
     q = (*p) * (*user_values.rbegin()); //result of the multiplication 
     cout << q << "; " << endl; 
     calculated_products.push_back(q); //saving result to the new list 
     user_values.pop_back(); //removing the last element of the list, in order to iterate backwards. This is probably the most confusing part. 
    } 

    //result output: 
    cout << "we have such list of products: " << endl; 
    for (const auto& t: calculated_products){ 
     cout << t << " "; 
    } 
    cout << endl; 
    return 0; 
} 

リストの要素を逆順に反復することは問題であり、リストの最後の要素を削除するオプションしか見つけられませんでした。

誰かがこれを行うためのより洗練されたアルゴリズムを思いついたのか、それとも上記のものを少なくとも改良することができるのだろうかと思います。

+0

質問は[SEコードレビュー](https://codereview.stackexchange.com/)に行く必要があります。 – user0042

+0

@JTejedor彼はリストを変更しています。したがって、 'rbegin()'は、次の繰り返しで正しい要素を指しています。なぜなら、目的の要素が最後になっているからです。 – Zinki

答えて

1

あなたは前後に戻ってから反復するrbegin()を使用することができます。すでに動作するコードの改善を求めて

auto i1 = user_values.begin(); 
auto i2 = user_values.rbegin(); 
double bufResult = 0; //for the product of the elements 

for(int i=0; i<user_values.size()/2; i++) 
{ 
    bufResult = (*i1) * (*i2); //result of the multiplication 
    cout << (*i1) << " * " << (*i2) << " = " << bufResult << "; " << endl; 
    calculated_products.push_back(bufResult); //saving result to the new list 
    i1++; 
    i2++; 
} 
関連する問題