【SZUOJ】【高精度板子】E. 大整数计算(运算符重载) ...

打印 上一主题 下一主题

主题 667|帖子 667|积分 2001

被学校oj的高精度恶心到了,所以我觉得以后把它当板子
  1. //??CBigInteger?????
  2. /********** Write your code here! **********/
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. class CBigInteger
  6. {
  7. public:
  8.         vector<int> a;
  9.         int si;
  10.         CBigInteger()
  11.         {
  12.                 si=1;
  13.         }
  14.         CBigInteger(vector<int> t,int s)
  15.         {
  16.                 si=s;
  17.                 a=t;
  18.         }
  19.         CBigInteger(int x)
  20.         {
  21.                 a.clear();
  22.                 si=x;
  23.         }
  24.         void sets(int x)
  25.         {
  26.                 si=x;
  27.         }
  28.         CBigInteger add(CBigInteger x,CBigInteger y,int s)
  29.         {
  30.                 int n=max(x.a.size(),y.a.size());
  31.                 vector<int> p(n);
  32.                 for(int i=0; i<n; i++)
  33.                 {
  34.                         if(i<x.a.size()) p[i]+=x.a[i];
  35.                         if(i<y.a.size()) p[i]+=y.a[i];
  36.                 }
  37.                 for(int i=0; i<n-1; i++)
  38.                 {
  39.                         p[i+1]+=p[i]/10;
  40.                         p[i]%=10;
  41.                 }
  42.                 if(p.size()==0) return CBigInteger(p,s);
  43.                 while(p[p.size()-1]>9)
  44.                 {
  45.                         p.push_back(p[p.size()-1]/10);
  46.                         p[p.size()-2]%=10;
  47.                 }
  48.                 return CBigInteger(p,s);
  49.         }
  50.         CBigInteger minus(CBigInteger x,CBigInteger y,int s)
  51.         {
  52.                 int n=max(x.a.size(),y.a.size());
  53.                 vector<int> p(n);
  54.                 for(int i=0; i<n; i++)
  55.                 {
  56.                         if(i<x.a.size()) p[i]+=x.a[i];
  57.                         if(i<y.a.size()) p[i]-=y.a[i];
  58.                 }
  59.                 for(int i=0; i<n-1; i++)
  60.                 {
  61.                         if(p[i]<0)
  62.                         {
  63.                                 p[i+1]--;
  64.                                 p[i]+=10;
  65.                         }
  66.                 }
  67.                 if(n==0) return CBigInteger(p,s);
  68.                 if(p[n-1]<0)
  69.                 {
  70.                         return minus(y,x,-s);
  71. //                        vector<int> q(n);
  72. //                        q[n-1]=-p[n-1];
  73. //                        p.pop_back();
  74. //                        return minus(CBigInteger(q,1),CBigInteger(p,1),-s);
  75.                 }
  76.                 return CBigInteger(p,s);
  77.         }
  78.         CBigInteger operator + (CBigInteger t)
  79.         {
  80.                 if(si==1)
  81.                 {
  82.                         if(t.si==1) return add(*this,t,1);
  83.                         else return minus(*this,t,1);
  84.                 }
  85.                 else
  86.                 {
  87.                         if(t.si==-1) return add(*this,t,-1);
  88.                         else return minus(*this,t,-1);
  89.                 }
  90.         }
  91.         CBigInteger operator - (CBigInteger t)
  92.         {
  93.                 if(si==1)
  94.                 {
  95.                         if(t.si==1) return minus(*this,t,1);
  96.                         else return add(*this,t,1);
  97.                 }
  98.                 else
  99.                 {
  100.                         if(t.si==-1) return minus(*this,t,-1);
  101.                         else return add(*this,t,-1);
  102.                 }
  103.         }
  104.         CBigInteger mul(CBigInteger x,int y,int num)
  105.         {
  106.                
  107.                 vector<int> p;
  108.                 for(int i=1; i<=num; i++) p.push_back(0);
  109.                 for(int i=0; i<x.a.size(); i++)
  110.                 {
  111.                         p.push_back(x.a[i]*y);
  112.                 }
  113.                 return CBigInteger(p,1);
  114.         }
  115.         CBigInteger operator * (CBigInteger t)
  116.         {
  117.                 CBigInteger p(si*t.si);
  118.                 for(int i=0; i<t.a.size(); i++)
  119.                 {
  120.                         p=p+mul(*this,t.a[i],i);
  121.                 }
  122.                 p.si=si*t.si;
  123.                 return p;
  124.         }
  125.         friend istream& operator >> (istream &in,CBigInteger &c);
  126.         friend ostream& operator << (ostream &out,const CBigInteger &c);
  127. };
  128. istream& operator >> (istream &in,CBigInteger &c)
  129. {
  130.         string s;
  131.         cin>>s;
  132.         int now=0;
  133.         if(s[now]=='-')
  134.         {
  135.                 c.sets(-1);
  136.                 now++;
  137.         }
  138.         else c.sets(1);
  139.         c.a.clear();
  140.         while(now<s.size())
  141.         {
  142.                 c.a.push_back(s[now]-'0');
  143.                 now++;
  144.         }
  145.         reverse(c.a.begin(),c.a.end());
  146.         while((!c.a.empty())&&c.a.back()==0) c.a.pop_back();
  147.         return in;
  148. }
  149. ostream& operator << (ostream &out,const CBigInteger &c)
  150. {
  151.         bool bz=0;
  152.         vector<int> p=c.a;
  153.         while((!p.empty())&&p.back()==0) p.pop_back();
  154.         if(p.size()==0)
  155.         {
  156.                 cout<<0;
  157.                 return out;
  158.         }
  159.         if(c.si==-1) bz=1;
  160.         if(bz) cout<<"(-";
  161.        
  162.         for(int i=p.size()-1; i>=0; i--) cout<<p[i];
  163.         if(bz) cout<<")";
  164.         return out;
  165. }
  166. /*******************************************/
  167. int main()
  168. {
  169.     int t;
  170.     char op;
  171.     CBigInteger bigNum1;
  172.     CBigInteger bigNum2;
  173.    
  174.     cin >> t;
  175.     while(t--)
  176.     {
  177.         cin >> bigNum1 >> op >> bigNum2;
  178.         cout << bigNum1 << " " << op << " " << bigNum2 << " = ";
  179.         if(op == '+')
  180.             cout << bigNum1 + bigNum2 << endl;
  181.         else if(op == '-')
  182.             cout << bigNum1 - bigNum2 << endl;
  183.         else if(op == '*')
  184.             cout << bigNum1 * bigNum2 << endl;
  185.     }
  186.     return 0;
  187. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表