fork(3) download
  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. #include<iomanip>
  5. #include<vector>
  6. #define sz size()
  7. using namespace std;
  8. string str1Copy(""),strAns;
  9. vector<string> store,storeAdd;
  10. void getSum(string str1,string str2) {
  11. strAns.erase();
  12. if(str2=="0") {
  13. strAns=str1;
  14. return;
  15. }
  16. int carry=0,i=0,j=0,sum=0;
  17. for(i=str1.sz-1,j=str2.sz-1;i>=0&&j>=0;i--,j--) {
  18. sum=(str1[i]-'0')+(str2[j]-'0')+carry;
  19. carry=sum==0?0:sum/10;
  20. sum%=10;
  21. strAns=char(sum+'0')+strAns;
  22. }
  23. while(i>=0) {
  24. sum=carry+(str1[i]-'0');
  25. carry=sum==0?0:sum/10;
  26. sum%=10;
  27. strAns=char(sum+'0')+strAns;
  28. i--;
  29. }
  30. while(j>=0) {
  31. sum=carry+(str2[j]-'0');
  32. carry=sum==0?0:sum/10;
  33. sum%=10;
  34. strAns=char(sum+'0')+strAns;
  35. j--;
  36. }
  37. strAns=carry>0?char(carry+'0')+strAns:strAns;
  38. }
  39.  
  40. void getDiff(string str1, string str2) {
  41. strAns.erase();
  42. int carry=0,i=0,j,diff=0,temp=0;
  43. for(i=str1.sz-1,j=str2.sz-1;i>=0&&j>=0;i--,j--) {
  44. diff=(str1[i]-'0')-(str2[j]-'0');
  45. if(diff>=0) {
  46. strAns=char(diff+'0')+strAns;
  47. continue;
  48. }
  49. diff+=10;
  50. strAns=char(diff+'0')+strAns;
  51. temp=i-1;
  52. while(str1[temp]=='0') {
  53. str1[temp]='9';
  54. temp--;
  55. }
  56. str1[temp]--;
  57. }
  58. while(i>=0) {
  59. strAns=str1[i]+strAns;
  60. i--;
  61. }
  62. for(i=0;strAns[i]=='0';)
  63. strAns.erase(i,1);
  64. }
  65.  
  66. int main() {
  67. int setwLen=0,cases=0,i=0,pos=0,j=0,caseVar=0;
  68. string str(""),str1(""),str2(""),strDash(""),tempStr1("");
  69. cin>>cases;
  70. for(caseVar=0;caseVar<cases;caseVar++) {
  71. strDash.erase();
  72. str.erase();
  73. str1.erase();
  74. str2.erase();
  75. cin>>str;
  76. pos=str.find_first_of("+-*");
  77. if(str[pos]=='+') {
  78. str1=str.substr(0,pos);
  79. str2=str.substr(pos+1);
  80. getSum(str1,str2);
  81. setwLen=max(strAns.sz,max(str2.sz+1,str1.sz));
  82. cout<<setw(setwLen)<<str1<<"\n";
  83. cout<<setw(setwLen-str2.sz)<<'+'<<str2<<"\n";
  84. //setwLen=max(strAns.sz,str2.sz+1);
  85. //cout<<setfill('-')<<setw(setwLen)<<"-"<<"\n";
  86. for(i=0;i<max(strAns.sz,str2.sz+1);i++)
  87. strDash+='-';
  88. cout<<setw(setwLen)<<strDash<<"\n";
  89. setwLen=max(strAns.sz,max(str2.sz+1,str1.sz));
  90. cout<<setfill(' ')<<setw(setwLen)<<strAns<<"\n\n";
  91. }
  92. else if(str[pos]=='-') {
  93. strDash.erase();
  94. str1Copy.erase();
  95. str1Copy=str1=str.substr(0,pos);
  96. str2=str.substr(pos+1);
  97. getDiff(str1Copy,str2);
  98. setwLen=max(strAns.sz,max(str2.sz+1,str1.sz));
  99. cout<<setw(setwLen)<<str1<<"\n";
  100. cout<<setw(setwLen-str2.sz)<<'-'<<str2<<"\n";
  101. for(i=0;i<max(strAns.sz,str2.sz+1);i++)
  102. strDash+='-';
  103. cout<<setw(setwLen)<<strDash<<"\n";
  104. setwLen=max(strAns.sz,max(str2.sz+1,str1.sz));
  105. cout<<setfill(' ')<<setw(setwLen)<<strAns<<"\n\n";
  106. }
  107. else if(str[pos]=='*') {
  108. tempStr1.erase();
  109. strDash.erase();
  110. store.erase(store.begin(),store.end());
  111. storeAdd.erase(store.begin(),store.end());
  112. str1=str.substr(0,pos);
  113. str2=str.substr(pos+1);
  114. tempStr1=str1;
  115. for(i=str2.sz-1;i>=0;i--) {
  116. if(str2[i]=='0') {
  117. tempStr1="0";
  118. goto skip;
  119. }
  120. else if(str2[i]=='1') {
  121. tempStr1=str1;
  122. goto skip;
  123. }
  124. for(j=0,tempStr1=str1;j<(str2[i]-'0')-1;j++) {
  125. getSum(tempStr1,str1);
  126. tempStr1=strAns;
  127. }
  128. skip:
  129. store.push_back(tempStr1);
  130. storeAdd.push_back(tempStr1);
  131. }
  132. for(i=1;i<store.sz;i++)
  133. for(j=0;j<i;j++)
  134. storeAdd[i]+='0';
  135. tempStr1=storeAdd[0];
  136. for(i=1;i<store.size();i++) {
  137. getSum(tempStr1,storeAdd[i]);
  138. tempStr1=strAns;
  139. }
  140. setwLen=max(tempStr1.sz,max(str1.sz,str2.sz+1));
  141. cout<<setw(setwLen)<<str1<<"\n";
  142. cout<<setw(setwLen-str2.sz)<<'*'<<str2<<"\n";
  143. for(i=0;i<max(str2.sz+1,store[0].sz);i++)
  144. strDash+='-';
  145. cout<<setw(setwLen)<<strDash<<"\n";
  146. for(i=0;i<store.size();i++)
  147. cout<<setw(setwLen-i)<<store[i]<<"\n";
  148. if(store.sz==1)
  149. continue;
  150. strDash.erase();
  151. for(i=0;i<max(tempStr1.sz,store[store.sz-1].sz);i++)
  152. strDash+='-';
  153. cout<<setw(setwLen)<<strDash<<"\n";
  154. cout<<setw(setwLen)<<tempStr1<<"\n\n";
  155. }
  156. }
  157. return 0;
  158. }
  159.  
  160.  
  161.  
Success #stdin #stdout 0.01s 2828KB
stdin
1
0+0
stdout
 0
+0
--
 0