Advertisement
MasFlam

B04 Mnożenie

Dec 9th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. void print(const vector<int>& v){
  6.     for(int i = 0; i < v.size(); ++i){
  7.         cerr<<v[i];
  8.     }
  9. }
  10.  
  11. void println(const vector<int>& v){
  12.     print(v);
  13.     cerr<<endl;
  14. }
  15.  
  16. void outprint(const vector<int>& v){
  17.     for(int i = 0; i < v.size(); ++i){
  18.         cout<<v[i];
  19.     }
  20. }
  21.  
  22. void outprintln(const vector<int>& v){
  23.     outprint(v);
  24.     cout<<endl;
  25. }
  26.  
  27. int suma_cyfr(vector<int> v){
  28.     int suma = 0;
  29.     for(int t : v){
  30.         suma += t;
  31.     }
  32.    
  33.     return suma;
  34. }
  35.  
  36. vector<int> mult(vector<int>, vector<int>);
  37.  
  38. int main()
  39. {
  40.     int z;
  41.     cin>>z;
  42.    
  43.     for(int i = 0; i < z; ++i){
  44.         string sa, sb;
  45.         cin>>sa;
  46.         cin>>sb;
  47.        
  48.         int temp = 0;
  49.         if(sa[0] == '-'){
  50.             sa = sa.substr(1, sa.length()-1);
  51.             temp++;
  52.         }
  53.         if(sb[0] == '-'){
  54.             sb = sb.substr(1, sb.length()-1);
  55.             temp++;
  56.         }
  57.        
  58.         vector<int> a(sa.length());
  59.         vector<int> b(sb.length());
  60.        
  61.         for(int i = 0; i < a.size(); ++i)
  62.             a[i] = sa[i] - '0';
  63.         for(int i = 0; i < b.size(); ++i)
  64.             b[i] = sb[i] - '0';
  65.        
  66.         vector<int> p = mult(a, b);
  67.        
  68.         if(temp % 2 == 1 && suma_cyfr(p) > 0){
  69.             cout<<"-";
  70.         }
  71.         outprintln(p);
  72.     }
  73.     return 0;
  74. }
  75.  
  76. vector<int> add(vector<int> a, vector<int> b){
  77.     while(a.size() > b.size())
  78.         b.push_back(0);
  79.     while(a.size() < b.size())
  80.         a.push_back(0);
  81.    
  82.     vector<int> sum;
  83.    
  84.     int carry = 0;
  85.     for(int i = 0; i < a.size(); ++i){
  86.         b.push_back(0);
  87.         int digit = a[i] + b[i] + carry;
  88.         carry = digit / 10;
  89.         digit = digit % 10;
  90.         sum.push_back(digit);
  91.     }
  92.    
  93.     return sum;
  94. }
  95.  
  96. vector<int> mult(vector<int> a, vector<int> b){
  97.     vector<int> product;
  98.    
  99.     reverse(a.begin(), a.end());
  100.     reverse(b.begin(), b.end());
  101.    
  102.     vector<vector<int>> to_add;
  103.    
  104.     for(int i = 0; i < a.size(); ++i){
  105.         vector<int> row;
  106.         //cerr<<">> row "<<i<<" <<"<<endl;
  107.        
  108.         int carry = 0;
  109.         for(int j = 0; j < b.size(); ++j){
  110.             int digit = a[i] * b[j] + carry;
  111.             carry = digit / 10;
  112.             digit = digit % 10;
  113.             //cerr<<" j: "<<j<<" | a[i]: "<<a[i]<<" b[j]: "<<b[j]<<" | carry: "<<carry<<" digit: "<<digit<<endl;
  114.            
  115.             row.push_back(digit);
  116.         }
  117.         if(carry != 0) row.push_back(carry);
  118.        
  119.         int row_offset = i;
  120.         for(int j = 0; j < row_offset; ++j){
  121.             row.insert(row.begin(), 0);
  122.         }
  123.         //cerr<<"row value (backwards): ";
  124.         //println(row);
  125.         to_add.push_back(row);
  126.     }
  127.     //cerr<<"\n------------------------------------------\n"<<endl;
  128.     //cerr<<">>>> ADDING UP THE ROWS <<<<"<<endl;
  129.     for(vector<int> t : to_add){
  130.         //cerr<<"adding row \"";
  131.         //print(t);
  132.         //cerr<<"\":"<<endl;
  133.         product = add(product, t);
  134.         //cerr<<"TOTAL PRODUCT: ";
  135.         //println(product);
  136.     }
  137.    
  138.     while(product.back() == 0 && product.size() > 1)
  139.         product.pop_back();
  140.    
  141.     reverse(product.begin(), product.end());
  142.     return product;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement