fork download
  1. #include <iostream>
  2. #define SumOfDigits(x, y, z) x + y + z - 3 * '0'
  3. #define ProductOfDigits(x, y) (x[0] - '0') * (y[0] - '0')
  4. using namespace std;
  5.  
  6. void addFrontZeros(string &x, int numberOfZeros){
  7. for(int i = 0; i < numberOfZeros; i++){
  8. x = '0' + x;
  9. }
  10. }
  11.  
  12. void addBackSideZeros(string &x, int numberOfZeros){
  13. for(int i = 0; i < numberOfZeros; i++){
  14. x = x + '0';
  15. }
  16. }
  17.  
  18. void deleteFrontZeros(string &x){
  19. while(x[0] == '0'){
  20. x.erase(0, 1);
  21. }
  22. }
  23.  
  24. int equalizeLength(string &x, string &y){
  25. int difference = x.size() - y.size();
  26.  
  27. if(difference > 0){
  28. addFrontZeros(y, difference);
  29. }
  30. else{
  31. addFrontZeros(x, -difference);
  32. }
  33.  
  34. return x.size();
  35. }
  36.  
  37. string add2Numbers(string x, string y){
  38. string result = "0";
  39. int length = equalizeLength(x, y);
  40. int sum;
  41.  
  42. addFrontZeros(result, length);
  43.  
  44. for(int i = length - 1; i >= 0; i--){
  45. sum = SumOfDigits(x[i], y[i], result[i + 1]);
  46. result[i + 1] = '0' + sum % 10;
  47. result[i] = '0' + sum / 10;
  48. }
  49.  
  50. deleteFrontZeros(result);
  51.  
  52. return result;
  53. }
  54.  
  55. string add3Numbers(string x, string y, string z){
  56. return add2Numbers(add2Numbers(x, y), z);
  57. }
  58.  
  59. // we know that x is bigger than y
  60. string subtract2Numbers(string x, string y){
  61. string result = "0";
  62. int length = equalizeLength(x, y);
  63. int sum;
  64.  
  65. addFrontZeros(result, length);
  66.  
  67. for(int i = length - 1; i >= 0; i--){
  68. sum = x[i] - y[i];
  69.  
  70. if(sum < 0){
  71. x[i - 1] -= 1;
  72. sum += 10;
  73. }
  74.  
  75. result[i + 1] += sum;
  76. }
  77.  
  78. deleteFrontZeros(result);
  79.  
  80. return result;
  81. }
  82.  
  83. string product2Numbers(string x, string y){
  84. int length, sum, fh, sh;
  85. string result , x1, x2, y1, y2, a, d, e;
  86.  
  87. if(x == "0" || y == "0") return "0";
  88.  
  89. length = equalizeLength(x, y);
  90.  
  91. if(length == 0) return "0";
  92. if(length == 1){
  93. sum = ProductOfDigits(x, y);
  94. if(sum >= 10){
  95. result += ('0' + sum / 10);
  96. }
  97. result += ('0' + sum % 10);
  98.  
  99. return result;
  100. }
  101.  
  102.  
  103. sh = length / 2;
  104. fh = length - sh;
  105.  
  106. x1 = x.substr(0, fh);
  107. x2 = x.substr(fh, sh);
  108.  
  109. y1 = y.substr(0, fh);
  110. y2 = y.substr(fh, sh);
  111.  
  112. a = product2Numbers(x1, y1);
  113. d = product2Numbers(x2, y2);
  114. e = product2Numbers(add2Numbers(x1, x2), add2Numbers(y1, y2));
  115.  
  116. e = subtract2Numbers(e, add2Numbers(a, d));
  117. addBackSideZeros(a, length - length % 2);
  118. addBackSideZeros(e, length / 2);
  119.  
  120. return add3Numbers(d, a, e);
  121. }
  122.  
  123. string decToBin(int n){
  124. string x = "";
  125.  
  126. while(n > 0){
  127. if(n % 2 == 1){
  128. x = '1' + x;
  129. }
  130. else{
  131. x = '0' + x;
  132. }
  133. n /= 2;
  134. }
  135.  
  136. return x;
  137. }
  138.  
  139.  
  140. string exponentiation(string number, int exponent){
  141. string exponentBINARY, solution="1";
  142.  
  143. exponentBINARY = decToBin(exponent);
  144.  
  145. if(number == "0"){
  146. return "0";
  147. }
  148.  
  149. for(int i = exponentBINARY.size() - 1; i >= 0; i--){
  150. if(exponentBINARY[i] == '1'){
  151. solution = product2Numbers(solution, number);
  152. }
  153. if(i != 0){
  154. number = product2Numbers(number, number);
  155. }
  156.  
  157.  
  158. }
  159. deleteFrontZeros(solution);
  160.  
  161. return solution;
  162. }
  163.  
  164. int main(){
  165. string x;
  166. int y;
  167.  
  168. cin >> x >> y;
  169. cout << exponentiation(x, y) << endl;
  170.  
  171. }
  172.  
Success #stdin #stdout 0.38s 4404KB
stdin
999 998
stdout
368431920179402670565266106166688554392730963000353558214173795232257867167639871401505378993498673892583929186776673064194587777225194966612444827019385461998629761763539715693625804463166827606071837649480308185167181305328276948924602734459417481909859762573072045316347134851633100520044224264999398395348279111620554671617583703880615736559711671450987840130220598050552789780620073490280921377493965104856403153201803993284312953924499261862047998224362607137324814025641505526661974051963982827458238546008213466274011769441535856548922023055573032551048572587707873039763953770536934182006181576378406634794821922546545419086522321394449067974830290779130557168479113136625669961822332684986899325934423230693005131721928759172955620174434846112491357984638394157785582151234165951597198014251142310452227220487976147850022213286017086303184853147773452945641790767767636352023464338544972184240958331431070781950852049489906496723247440223065962377792404092279670902951279017983804070004097205377432307495742334094972103761657290877454065923200211994492435958903915163594033234531546666134865577941949588962873685639069378855688141371495492242478188976062703774084373098488083222158943658933083510005421618288120800781034471279143330490545134179843871029847806355730220733132187636455604091140504178790455064954985073623215207674034084126692963311642554349837484530479781067682340991062362057709955221301974964886686028537829464795623497762552139446420893220939643950302748674670826445599383296533746462472883178178055625370658011434337781168731477930453313734150839859592506304378151432966537447652860627784913087272145502553384136914814856800056795294362183672093147017886909648347163223033612833836397280280164928180342089656550385564123084226575880346853255629185504211387097964947983296418486807910368192304319288675901377636979852719082633016857577588421328023383937494141686982832799079059890451694654668322852367362476060970020833849047976259461650845460962365801354414562275415181504700443768616664011587060288486979322554050631516573904415364422913441179842540020313897509742877379457639654001193716107556644382962043629425038585784384045318886548990480882745585403225912485598597260299167482456716482521862756781089472923963838512573734272514907711292050283038788098942636831619611167815722814664264969681685056160087054191599725439070467166510243531545799884704083464019193970991835404094021370319804005047642914847478163911525360746180605412437052214062286001991788967122292243364416701851008145843562412862571414745220521962335430041160792153856793135398618000794791687676007709600293983846305326101701140647517522653403831781528599990085342101304731403206583651761506136045814991310837675499864791636366912437083577899725967893000158198760368074438923834813161831219361378217009912838997977332765248860377966572540285679637699658683517769334532495973494590411847499496226354731466040884173262945656006250472762780671952372154922726511789750585315184434426084501502002001