#include <iostream>
#include <locale>
#include <math.h>
using namespace std;
class my_put : public std::num_put<char> {
iter_type do_put (iter_type out, ios_base& str, char_type fill, double val) const
{
streamsize prec = str.precision();
if((str.flags() & ios_base::floatfield) == ios_base::fixed && fabs(val)*2 <= pow(10.0, -(int)prec))
str.precision(0);
out = std::num_put<char>::do_put(out, str, fill, val);
str.precision(prec);
return out;
}
};
int main()
{
double a[] = {123, 0, 0.001, 0.0001 };
cout.imbue(locale(cout.getloc(), new my_put));
cout.precision(3);
cout.setf(ios_base::fixed, ios_base::floatfield);
for(int i = 0; i < 4; ++i)
cout << a[i] << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bG9jYWxlPgojaW5jbHVkZSA8bWF0aC5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgbXlfcHV0IDogcHVibGljIHN0ZDo6bnVtX3B1dDxjaGFyPiB7CglpdGVyX3R5cGUgZG9fcHV0IChpdGVyX3R5cGUgb3V0LCBpb3NfYmFzZSYgc3RyLCBjaGFyX3R5cGUgZmlsbCwgZG91YmxlIHZhbCkgY29uc3QKCXsKCQlzdHJlYW1zaXplIHByZWMgPSBzdHIucHJlY2lzaW9uKCk7CgkJaWYoKHN0ci5mbGFncygpICYgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpID09IGlvc19iYXNlOjpmaXhlZCAmJiBmYWJzKHZhbCkqMiA8PSBwb3coMTAuMCwgLShpbnQpcHJlYykpCgkJCXN0ci5wcmVjaXNpb24oMCk7CgkJb3V0ID0gc3RkOjpudW1fcHV0PGNoYXI+Ojpkb19wdXQob3V0LCBzdHIsIGZpbGwsIHZhbCk7CgkJc3RyLnByZWNpc2lvbihwcmVjKTsKCQlyZXR1cm4gb3V0OwoJfQp9OwoKaW50IG1haW4oKQp7Cglkb3VibGUgYVtdID0gezEyMywgMCwgMC4wMDEsIDAuMDAwMSB9OwoJY291dC5pbWJ1ZShsb2NhbGUoY291dC5nZXRsb2MoKSwgbmV3IG15X3B1dCkpOwoJY291dC5wcmVjaXNpb24oMyk7Cgljb3V0LnNldGYoaW9zX2Jhc2U6OmZpeGVkLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7Cglmb3IoaW50IGkgPSAwOyBpIDwgNDsgKytpKQoJCWNvdXQgPDwgYVtpXSA8PCAnXG4nOwp9