fork(1) download
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5.  
  6.  
  7.  
  8. void reverse(char *str){
  9.  
  10. int i = 0;
  11. int j = strlen(str)-1;
  12.  
  13. while(i < j){
  14.  
  15. char c = str[i];
  16. str[i] = str[j];
  17. str[j] = c;
  18. i++;
  19. j--;
  20.  
  21. }
  22. return ;
  23.  
  24.  
  25. }
  26.  
  27.  
  28. void swap2(char *str1, char *str2)
  29. {
  30. char *temp = (char *)malloc((strlen(str1) + 1) * sizeof(char));
  31. strcpy(temp, str1);
  32. strcpy(str1, str2);
  33. strcpy(str2, temp);
  34. free(temp);
  35. }
  36.  
  37. void shiftRight(char *arr,int n)
  38. {
  39.  
  40. char tmp[30001];
  41. int i;
  42.  
  43.  
  44. // cout << arr <<endl;
  45. for( i =0; i < n ;i++)
  46. tmp[i] ='0';
  47.  
  48. int index =0;
  49. int k;
  50.  
  51.  
  52. // for( k =i ; k < i+strlen(arr)-1; k++){
  53. // tmp[k] = arr[index];
  54. // index++;
  55. // }
  56.  
  57. k = i;
  58.  
  59.  
  60. //cout << k << "before " <<i+strlen(arr)-1<<endl;
  61. while(k <= i+strlen(arr)-1){
  62.  
  63. tmp[k] = arr[index];
  64. index++;
  65. k++;
  66. }
  67.  
  68.  
  69.  
  70. tmp[k] = '\0';
  71.  
  72. // cout <<"222"<< tmp <<endl;
  73.  
  74. int j;
  75. // cout << endl;
  76.  
  77.  
  78.  
  79. strcpy(arr, tmp);
  80. //cout << arr <<endl;
  81.  
  82.  
  83. }
  84.  
  85.  
  86. void add(char *num1, char *num2){
  87.  
  88.  
  89. int num;
  90. int carry = 0;
  91. int dig;
  92.  
  93.  
  94.  
  95. if(strlen(num2) > strlen(num1))
  96. swap2(num1, num2);
  97.  
  98. int i ;
  99. for( i = 0; i < strlen(num2); i++)
  100. {
  101.  
  102.  
  103. num = num1[i]-'0' + num2[i]-'0' +carry;
  104. dig = num %10;
  105. carry = num/10;
  106.  
  107. num1[i] = dig +'0';
  108. }
  109.  
  110.  
  111. while(i < strlen(num1)){
  112.  
  113. num = num1[i]-'0' +carry;
  114. dig = num %10;
  115. carry = num/10;
  116.  
  117. num1[i] = dig+'0';
  118. i++;
  119. }
  120.  
  121. while(carry > 0){
  122.  
  123.  
  124. dig = carry %10;
  125. carry = carry/10;
  126.  
  127. num1[i] = dig+'0';
  128. i++;
  129.  
  130. }
  131.  
  132. num1[i] = '\0';
  133.  
  134.  
  135.  
  136.  
  137.  
  138. }
  139.  
  140. void mul(char *num1, char *num2){
  141.  
  142. char prev[30001];
  143. char curr[30001];
  144.  
  145.  
  146. for(int i = 0 ; i < 30001; i++)
  147. prev[i] = '0';
  148.  
  149.  
  150. int carry = 0;
  151. int num;
  152. int dig;
  153.  
  154. int k =0;
  155. int i;
  156. int j;
  157. int tot_l = 0;
  158. for( i =0; i < strlen(num2); i++){
  159. k = 0;
  160. for(j =0; j < strlen(num1);j++){
  161. num = (num1[i]-'0') * (num2[j]-'0')+carry;
  162. carry = num/10;
  163. dig = num % 10;
  164. curr[k] = dig+'0';
  165. k++;
  166. tot_l++;
  167. }
  168.  
  169. while(carry > 0){
  170.  
  171. dig = carry %10;
  172. carry = carry/10;
  173. curr[k] = dig + '0';
  174. k++;
  175. tot_l++;
  176.  
  177. }
  178.  
  179.  
  180. shiftRight(curr,i);
  181.  
  182. add(prev,curr);
  183.  
  184. }
  185.  
  186. prev[tot_l] = '\0';
  187. cout << prev;
  188.  
  189.  
  190.  
  191.  
  192.  
  193. }
  194. int main() {
  195.  
  196.  
  197.  
  198. int tes;
  199. cin >> tes;
  200. char arr[30001];
  201. char num1[10001];
  202. char num2[10001];
  203.  
  204. while(tes--){
  205.  
  206. cin >> num1 >> num2;
  207.  
  208. reverse(num1);
  209. reverse(num2);
  210.  
  211. mul(num1, num2);
  212.  
  213.  
  214.  
  215. }
  216. return 0;
  217.  
  218.  
  219. }
Success #stdin #stdout 0.01s 15240KB
stdin
1
10 9
stdout
00