#include <iostream>
#include <stdexcept>
#include <limits>
// tons of ways to make this faster on the bithacks page
int maxbitpos( int n) // assume positive
{
int p = 0 ;
while ( n >>= 1 ) ++ p;
return p;
}
// doing power as n*n*n*n*n*... is as pointless as bubble sort
int mypow( int n, int p)
{
if ( p< 0 )
throw std:: runtime_error ( "negative power not supported" ) ;
if ( p== 0 ) return 1 ; // not hanlding negative powers for this
if ( p== 1 ) return n; // avoid overflow in squaring
if ( 2 * maxbitpos( n) >= std:: numeric_limits < int > :: digits )
throw std:: overflow_error ( "integer overflow in pow()" ) ;
int r = mypow( n* n, p/ 2 ) ;
if ( p& 1 ) {
if ( maxbitpos( n) + maxbitpos( r) >= std:: numeric_limits < int > :: digits )
throw std:: overflow_error ( "integer overflow in pow()" ) ;
return n* r;
} else {
return r;
}
}
int main( )
{
for ( ;; ) {
std:: cout << "integer: " ;
int n;
std:: cin >> n;
std:: cout << "power: " ;
int p;
std:: cin >> p;
if ( ! std:: cin ) break ; // quit on EOF
try {
std:: cout << "result = " << mypow( n, p) << '\n ' ;
} catch ( const std:: exception & e) {
std:: cout << "could not pow(): " << e.what ( ) << '\n ' ;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8bGltaXRzPgoKLy8gdG9ucyBvZiB3YXlzIHRvIG1ha2UgdGhpcyBmYXN0ZXIgb24gdGhlIGJpdGhhY2tzIHBhZ2UKaW50IG1heGJpdHBvcyhpbnQgbikgLy8gYXNzdW1lIHBvc2l0aXZlCnsKICAgIGludCBwID0gMDsKICAgIHdoaWxlKG4gPj49IDEpICsrcDsKICAgIHJldHVybiBwOwp9CgovLyBkb2luZyBwb3dlciBhcyBuKm4qbipuKm4qLi4uIGlzIGFzIHBvaW50bGVzcyBhcyBidWJibGUgc29ydAppbnQgbXlwb3coaW50IG4sIGludCBwKQp7CiAgICBpZihwPDApIAogICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigibmVnYXRpdmUgcG93ZXIgbm90IHN1cHBvcnRlZCIpOwogICAgaWYocD09MCkgcmV0dXJuIDE7IC8vIG5vdCBoYW5sZGluZyBuZWdhdGl2ZSBwb3dlcnMgZm9yIHRoaXMKICAgIGlmKHA9PTEpIHJldHVybiBuOyAvLyBhdm9pZCBvdmVyZmxvdyBpbiBzcXVhcmluZwoKICAgIGlmKDIqbWF4Yml0cG9zKG4pID49IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6ZGlnaXRzKQogICAgICAgIHRocm93IHN0ZDo6b3ZlcmZsb3dfZXJyb3IoImludGVnZXIgb3ZlcmZsb3cgaW4gcG93KCkiKTsKCiAgICBpbnQgciA9IG15cG93KG4qbiwgcC8yKTsKCiAgICBpZihwJjEpIHsKICAgICAgICBpZihtYXhiaXRwb3MobikgKyBtYXhiaXRwb3MocikgPj0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjpkaWdpdHMpCiAgICAgICAgICAgIHRocm93IHN0ZDo6b3ZlcmZsb3dfZXJyb3IoImludGVnZXIgb3ZlcmZsb3cgaW4gcG93KCkiKTsKICAgICAgICByZXR1cm4gbipyOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gcjsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBmb3IoOzspIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImludGVnZXI6ICI7CiAgICAgICAgaW50IG47CiAgICAgICAgc3RkOjpjaW4gPj4gbjsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJwb3dlcjogIjsKICAgICAgICBpbnQgcDsKICAgICAgICBzdGQ6OmNpbiA+PiBwOwoKICAgICAgICBpZighc3RkOjpjaW4pIGJyZWFrOyAvLyBxdWl0IG9uIEVPRgoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgInJlc3VsdCA9ICIgPDwgbXlwb3cobiwgcCkgPDwgJ1xuJzsKICAgICAgICB9IGNhdGNoKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiY291bGQgbm90IHBvdygpOiAiIDw8IGUud2hhdCgpIDw8ICdcbic7CiAgICAgICAgfQogICAgfQp9Cg==