简体   繁体   中英

Pairwise multiplication of the opposite elements of the c++ doubly-linked list

I've been given a following task: with the given double-linked list of real numbers you have to multiply the opposite elements of the list (first with the last, second with the last minus one, etc.) and add this product to the new list. Ie: we have that list:

1.1 2.2 3.3 4.4 5.5 

Then we print

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

And the final list is:

6.05 9.68 10.89 

I've come up with the following naïve algorithm:

#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;
}

Since it is problematic to iterate through elements of the list backwards, I've only found the option of removing the last elements of the list.

So I wonder whether someone could came up with more elegant algorithm for doing that, or at least refine the one above.

You can use rbegin() to iterate from back to forth:

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++;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM