#include <iostream>
#include <complex>
#include <map>
struct Level
{
long double coefficient;
size_t exponent;
Level(long double ld = 0, size_t s = 0): //default: Summe, 0
coefficient(ld), exponent(s) {}
long double operator()(long double x)
{
return coefficient * std::pow(x, exponent);
}
};
bool operator<(Level const& a, Level const& b)
{
return a.exponent < b.exponent;
}
bool operator==(Level const& a, Level const& b)
{
return a.exponent == b.exponent;
}
//Template-Meta Version?
class Polynom
{
std::map<size_t, Level> mLevels;//Redundanz-Pegel: 4/10 :D
size_t const mNLevel;
public:
template<typename it_t>
Polynom(it_t a, it_t b):
mLevels(a, b),
mNLevel(mLevels.size())
{
for(size_t a(0) ; a < mLevels.size(); ++a) //Range-Based for in C++11 - bin zu faul zum iterieren :p
mLevels[a].exponent = a;
}
long double operator()(long double X)
{
long double sum(0);
for(size_t a(0) ; a < mLevels.size(); ++a) //Range-Based for in C++11 - bin zu faul zum iterieren :p
sum += mLevels[a](X);
return sum;
}
};
int main()
{
std::map<size_t, Level> v;
v[2] = 3;
v[1] = 9;
v[0] = 3.41;
//Die Funktion lautet: 3x zum Quadrat + 2x + 3.41
Polynom p(v.begin(), v.end());
std::cout << p(1) << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y29tcGxleD4KI2luY2x1ZGUgPG1hcD4KCnN0cnVjdCBMZXZlbAp7CiAgICBsb25nIGRvdWJsZSBjb2VmZmljaWVudDsKICAgIHNpemVfdCBleHBvbmVudDsKCiAgICBMZXZlbChsb25nIGRvdWJsZSBsZCA9IDAsIHNpemVfdCBzID0gMCk6IC8vZGVmYXVsdDogU3VtbWUsIDAKICAgIGNvZWZmaWNpZW50KGxkKSwgZXhwb25lbnQocykge30KCiAgICBsb25nIGRvdWJsZSBvcGVyYXRvcigpKGxvbmcgZG91YmxlIHgpCiAgICB7CiAgICAgICAgICAgIHJldHVybiBjb2VmZmljaWVudCAqIHN0ZDo6cG93KHgsIGV4cG9uZW50KTsKICAgIH0KfTsKCmJvb2wgb3BlcmF0b3I8KExldmVsIGNvbnN0JiBhLCBMZXZlbCBjb25zdCYgYikKewogICAgICAgIHJldHVybiBhLmV4cG9uZW50IDwgYi5leHBvbmVudDsKfQpib29sIG9wZXJhdG9yPT0oTGV2ZWwgY29uc3QmIGEsIExldmVsIGNvbnN0JiBiKQp7CiAgICAgICAgcmV0dXJuIGEuZXhwb25lbnQgPT0gYi5leHBvbmVudDsKfQoKLy9UZW1wbGF0ZS1NZXRhIFZlcnNpb24/CmNsYXNzIFBvbHlub20KewogICAgc3RkOjptYXA8c2l6ZV90LCBMZXZlbD4gbUxldmVsczsvL1JlZHVuZGFuei1QZWdlbDogNC8xMCA6RAogICAgc2l6ZV90IGNvbnN0IG1OTGV2ZWw7CgpwdWJsaWM6CgogICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIGl0X3Q+CiAgICAgICAgUG9seW5vbShpdF90IGEsIGl0X3QgYik6CiAgICAgICAgbUxldmVscyhhLCBiKSwKICAgICAgICBtTkxldmVsKG1MZXZlbHMuc2l6ZSgpKSAKICAgICAgICB7CgkJZm9yKHNpemVfdCBhKDApIDsgYSA8IG1MZXZlbHMuc2l6ZSgpOyArK2EpIC8vUmFuZ2UtQmFzZWQgZm9yIGluIEMrKzExIC0gYmluIHp1IGZhdWwgenVtIGl0ZXJpZXJlbiA6cAogICAgICAgCQltTGV2ZWxzW2FdLmV4cG9uZW50ID0gYTsKCX0KCiAgICAgICAgbG9uZyBkb3VibGUgb3BlcmF0b3IoKShsb25nIGRvdWJsZSBYKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHN1bSgwKTsKICAgICAgICAgICAgICAgIGZvcihzaXplX3QgYSgwKSA7IGEgPCBtTGV2ZWxzLnNpemUoKTsgKythKSAvL1JhbmdlLUJhc2VkIGZvciBpbiBDKysxMSAtIGJpbiB6dSBmYXVsIHp1bSBpdGVyaWVyZW4gOnAKICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IG1MZXZlbHNbYV0oWCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHN1bTsKICAgICAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgICAgICBzdGQ6Om1hcDxzaXplX3QsIExldmVsPiB2OwogICAgICAgIHZbMl0gPSAzOwogICAgICAgIHZbMV0gPSA5OwogICAgICAgIHZbMF0gPSAzLjQxOwoJLy9EaWUgRnVua3Rpb24gbGF1dGV0OiAzeCB6dW0gUXVhZHJhdCArIDJ4ICsgMy40MQoKICAgICAgICBQb2x5bm9tIHAodi5iZWdpbigpLCB2LmVuZCgpKTsKCiAgICAgICAgc3RkOjpjb3V0IDw8IHAoMSkgPDwgJ1xuJzsKfQ==