fork download
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <limits>
  4.  
  5. // tons of ways to make this faster on the bithacks page
  6. int maxbitpos(int n) // assume positive
  7. {
  8. int p = 0;
  9. while(n >>= 1) ++p;
  10. return p;
  11. }
  12.  
  13. // doing power as n*n*n*n*n*... is as pointless as bubble sort
  14. int mypow(int n, int p)
  15. {
  16. if(p<0)
  17. throw std::runtime_error("negative power not supported");
  18. if(p==0) return 1; // not hanlding negative powers for this
  19. if(p==1) return n; // avoid overflow in squaring
  20.  
  21. if(2*maxbitpos(n) >= std::numeric_limits<int>::digits)
  22. throw std::overflow_error("integer overflow in pow()");
  23.  
  24. int r = mypow(n*n, p/2);
  25.  
  26. if(p&1) {
  27. if(maxbitpos(n) + maxbitpos(r) >= std::numeric_limits<int>::digits)
  28. throw std::overflow_error("integer overflow in pow()");
  29. return n*r;
  30. } else {
  31. return r;
  32. }
  33. }
  34.  
  35. int main()
  36. {
  37. for(;;) {
  38. std::cout << "integer: ";
  39. int n;
  40. std::cin >> n;
  41.  
  42. std::cout << "power: ";
  43. int p;
  44. std::cin >> p;
  45.  
  46. if(!std::cin) break; // quit on EOF
  47.  
  48. try {
  49. std::cout << "result = " << mypow(n, p) << '\n';
  50. } catch(const std::exception& e) {
  51. std::cout << "could not pow(): " << e.what() << '\n';
  52. }
  53. }
  54. }
  55.  
Success #stdin #stdout 0.02s 2864KB
stdin
2
10
10
10
2
30
2
31

stdout
integer: power: result = 1024
integer: power: could not pow(): integer overflow in pow()
integer: power: result = 1073741824
integer: power: could not pow(): integer overflow in pow()
integer: power: