v 0. Pasted by UnderFelixAbove as cpp at 2010-05-18 22:02:29 MSK and set expiration to never.

Paste will expire never.

  1. // Меньшиков. Тренировка 3.
  2. // 3E. Длинное произведение [longprod]
  3. // ibelyaev: 02Mar2010
  4.  
  5. #include <iostream>
  6. #include <string>
  7. #include <cstring>
  8.  
  9. using namespace std;
  10.  
  11. const int max_len = 5100;
  12. struct BigInt
  13. {
  14.     int digits[max_len];
  15.     int amount;
  16.     BigInt()
  17.     {
  18.         memset(digits,0,sizeof(digits));
  19.         amount = 1;
  20.     }
  21.     void init(string &str)
  22.     {
  23.         memset(digits,0,sizeof(digits));
  24.         amount = str.size();
  25.         int pos = 0;
  26.         for (int i=amount-1;i>=0;i--)
  27.             digits[pos++] = str[i] - '0';
  28.     }
  29.     void input()
  30.     {
  31.         string str;
  32.         cin>>str;
  33.         init(str);
  34.     }
  35.     void output()
  36.     {
  37.         for (int i=amount-1;i>=0;i--)
  38.             cout<<digits[i];
  39.     }
  40. };
  41. int osn = 10;
  42. BigInt operator * (const BigInt &a, const BigInt &b)
  43. {
  44.     BigInt res;
  45.     int r = 0;
  46.     for (int i=0;i<a.amount;i++){
  47.         for (int j=0;j<b.amount | r;j++)
  48.         {
  49.             res.digits[i+j] += a.digits[i]*b.digits[j]+r;
  50.             r = res.digits[i+j]/osn;
  51.             res.digits[i+j] -= r * osn;
  52.         }
  53.     }
  54.     int pos = a.amount + b.amount;
  55.     while (pos>0 && !res.digits[pos])
  56.         pos--;
  57.     res.amount = pos + 1;
  58.     return res;
  59. }
  60. int main()
  61. {
  62.     BigInt a,b,res;
  63.     a.input();
  64.     b.input();
  65.     res = a*b;
  66.     res.output();
  67.     return 0;
  68. }


Editing is locked.