#include <iostream>
using namespace std;
double power(double x, int n)
{
// key is to avoid re-calculating something you’ve done.
if(n==0)
return double(1);
else if(n<0)
return 1/power(x, -n);
else
{
double pow2s[sizeof(int)*8];
pow2s[0] = x;
double result = 1;
int bit = 0;
while(true)
{
if(n&0x1)
result *= pow2s[bit];
n >>= 1;
if(0==n)
break;
pow2s[bit+1] = pow2s[bit] * pow2s[bit];
++bit;
}
return result;
}
}
int main() {
std::cout << power(2.0, 0) << std::endl;
std::cout << power(2.0, 1) << std::endl;
std::cout << power(2.0, 3) << std::endl;
std::cout << power(2.0, 5) << std::endl;
std::cout << power(2.0, -4) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZG91YmxlIHBvd2VyKGRvdWJsZSB4LCBpbnQgbikKewogIC8vIGtleSBpcyB0byBhdm9pZCByZS1jYWxjdWxhdGluZyBzb21ldGhpbmcgeW914oCZdmUgZG9uZS4KICBpZihuPT0wKQogICAgIHJldHVybiBkb3VibGUoMSk7CiAgZWxzZSBpZihuPDApCiAgCSByZXR1cm4gMS9wb3dlcih4LCAtbik7CiAgZWxzZQogIHsKICAgIGRvdWJsZSBwb3cyc1tzaXplb2YoaW50KSo4XTsKICAgIHBvdzJzWzBdID0geDsKICAgIGRvdWJsZSByZXN1bHQgPSAxOwogICAgaW50IGJpdCA9IDA7CiAgICB3aGlsZSh0cnVlKQogICAgewogICAgICAgaWYobiYweDEpCiAgICAgICAgIHJlc3VsdCAqPSBwb3cyc1tiaXRdOwogICAgICAgbiA+Pj0gMTsKICAgICAgIGlmKDA9PW4pCiAgICAgICAgIGJyZWFrOwogICAgICAgcG93MnNbYml0KzFdID0gcG93MnNbYml0XSAqIHBvdzJzW2JpdF07CiAgICAgICArK2JpdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgcG93ZXIoMi4wLCAwKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgcG93ZXIoMi4wLCAxKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgcG93ZXIoMi4wLCAzKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgcG93ZXIoMi4wLCA1KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgcG93ZXIoMi4wLCAtNCkgPDwgc3RkOjplbmRsOwoKCXJldHVybiAwOwp9