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.