第五章Biginteger部分实现

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <vector>
  4 
  5 using namespace std;
  6 
  7 struct BigInteger
  8 {
  9     static const int BASE=100000000;
 10     static const int WIDTH=8;
 11 
 12     vector<int> s;
 13 
 14     BigInteger(long long int num=0){ *this=num; }
 15 
 16     BigInteger operator=(long long num)
 17     {
 18         s.clear();
 19 
 20         do
 21         {
 22             s.push_back(num%BASE);
 23             num/=BASE;
 24 
 25         }while(num>0);
 26 
 27         return *this;
 28     }
 29 
 30     BigInteger operator=(const string& num)
 31     {
 32         s.clear();
 33 
 34         for(int end=num.length()-1;;)
 35         {
 36             int x,start=end-WIDTH+1;
 37 
 38             if(start>=0)
 39             {
 40                 sscanf(num.substr(start,WIDTH).c_str(),"%d",&x);
 41                 s.push_back(x);
 42                 end=start-1;
 43             }
 44             else if(end>=0)
 45             {
 46                 sscanf(num.substr(0,end+1).c_str(),"%d",&x);
 47                 s.push_back(x);
 48                 break;
 49             }
 50             else
 51                 break;
 52         }
 53 
 54         return *this;
 55     }
 56 
 57     BigInteger operator+(const BigInteger& b)
 58     {
 59         BigInteger c;
 60         c.s.clear();                 //必须先clear为空不然会有一个默认的0值在c.s 中
 61 
 62         int c1=0;
 63 
 64         for(unsigned int i=0;;i++)
 65         {
 66             if(i<s.size() && i<b.s.size())
 67             {
 68                 int sum=s[i]+b.s[i]+c1;
 69                 c1=sum/BASE;
 70                 sum%=BASE;
 71                 c.s.push_back(sum);
 72             }
 73             else if(i<s.size() && i>=b.s.size())
 74             {
 75                 int sum=s[i]+c1;
 76                 c1=sum/BASE;
 77                 sum%=BASE;
 78                 c.s.push_back(sum);
 79             }
 80             else if(i>=s.size() && i<b.s.size())
 81             {
 82                 int sum=b.s[i]+c1;
 83                 c1=sum/BASE;
 84                 sum%=BASE;
 85                 c.s.push_back(sum);
 86             }
 87             else if(i>=s.size() && i>=b.s.size())
 88             {
 89                 if(c1==1)
 90                     c.s.push_back(c1);
 91                 else
 92                     break;
 93             }
 94                 
 95         }
 96 
 97         return c;
 98             
 99     }
100 
101     bool operator<(const BigInteger& b)
102     {
103         if(s.size()!=b.s.size()) return s.size()<b.s.size();
104 
105         for(unsigned int i=s.size()-1;i>=0;i--)
106             if(s[i]!=b.s[i])
107                 return s[i]<b.s[i];
108 
109         return false;
110     }
111 
112     friend ostream& operator<<(ostream& out,const BigInteger& x);
113     friend istream& operator>>(istream& in,const BigInteger& x);
114 };
115 
116 ostream& operator<<(ostream& out,const BigInteger& x)
117 {
118 
119 
120     for(int i=x.s.size()-1;i>=0;i--)
121     {
122         if(x.s[i]==0)
123         {
124             for(int j=1;j<=x.WIDTH;j++)
125                 out<<0;
126         }
127         else
128             out<<x.s[i];
129     }
130 
131          //cout<<x.s.size()<<endl;
132     return out;
133 }
134 
135 istream& operator>>(istream& in,BigInteger& x)
136 {
137     string s;
138     if(!(in>>s)) return in;
139 
140     x=s;
141     return in;
142 }
143 
144 int main()
145 {
146     BigInteger bi1;
147     BigInteger bi2;
148 
149     cin>>bi1;
150     cin>>bi2;
151 
152 
153     if(bi1<bi2)
154     {
155         cout<<bi1<<endl;
156         cout<<bi2<<endl;
157     }
158     else
159     {
160         cout<<bi2<<endl;
161         cout<<bi1<<endl;
162     }
163 
164     cout<<bi2+bi1<<endl;
165     return 0;
166 
167 }

 

posted @ 2017-07-22 21:06  lan126  阅读(123)  评论(0编辑  收藏  举报