码迷,mamicode.com
首页 > 其他好文 > 详细

大整数加减乘除 - 初代

时间:2018-05-22 15:02:41      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:color   倒序   比较大小   efi   个数   ++   else   移位操作   AC   

之前写的,写的不是很好……

放在这相当于一个备份……

欢迎提意见!

  1 #include<iostream>
  2 #include<string>
  3 #include<cmath>
  4 #define N 500
  5 using namespace std;
  6 
  7 class num
  8 {
  9     private:
 10         int number[N];
 11         int sign;                                                  //判断正负:正 1;负 -1 
 12     public:
 13         num(int t=0);                                              //构造 t 
 14         num(num &n);                                               //复制构造函数 
 15         num(num &a,char symbol,num &b);                            //重载构造函数(计算中枢) 
 16         int leng();                                                //计算位数 
 17         void get();
 18         void put();
 19         void copy(num &n);                                         //复制 
 20         void move(int t);                                          //移位(*10^t) 
 21         int compare(num &n);                                       //绝对值比较大小:大 1;小 -1;相等 0  
 22         void carry();                                              //处理进位 
 23         void add(num &n);                                          //n1 + n2 
 24         void multiply(num &n);                                     //n1 * n2
 25         void subtract(num &n);                                     //n1 - n2
 26         void divide(num &n);                                       //n1 / n2 
 27 };
 28 int main()
 29 {
 30     while(true) 
 31     {
 32         num a,b;
 33         a.get(); 
 34         b.get();            
 35         a.divide(b);
 36         a.put();
 37         num c(a,*,b);
 38         c.put();
 39         a.put(); 
 40         cout<<endl;
 41     }
 42     return 0;
 43 }
 44 
 45 num::num(int t)
 46 {
 47     for(int i=0;i<N;++i)
 48         number[i]=0;
 49     sign=1;                               //至此,初始化为 0 
 50     number[0]=t;                       //将第一位赋值,然后进行进位处理 
 51     carry();
 52 }
 53 
 54 num::num(num &n)
 55 {
 56     copy(n);
 57 } 
 58 
 59 num::num(num &a,char symbol,num &b)
 60 {
 61     copy(a);
 62     if(symbol == +)    
 63         add(b);
 64     else if(symbol == -)
 65         subtract(b);
 66     else if(symbol == *)
 67         multiply(b);
 68     else if(symbol == /)
 69         divide(b);
 70 }
 71 
 72 int num::leng()
 73 {
 74     int length=0;
 75     bool flag=false;                          //判断位数,逆向循环,未到最大位时一直为 false 
 76     for(int i=N-1;i>=0;--i)
 77     {
 78         if(number[i] != 0)
 79             flag=true;
 80         if(flag)
 81             length += 1;
 82     }
 83     return length;
 84 }
 85 
 86 void num::get()
 87 {
 88     char Num[N];
 89     cout<<"请输入一个整数:";
 90     int i;
 91     for(i=0;i<N;++i)
 92     {
 93         Num[i]=getchar();
 94         if(Num[i] == \n)
 95         {
 96             --i;
 97             break;
 98         }                                      //一行输入一个数 
 99         if(Num[i] == - && i == 0)
100         {
101             sign=-1;
102             --i;                               //判断正负 
103         }
104     }
105     for(int j=0;j<=i;j++)
106     {
107         number[j]=Num[i-j]-0;
108         if(number[j] < 0 || number[j] > 9)
109         {
110             cout<<"输入错误!";
111             exit(0);
112         }        
113     }                                          //倒序,转化为整形数组,并判断其合法性 
114 }
115 
116 void num::put()
117 {
118     bool flag=false;                           //判断位数,逆向循环,未到最大位时一直为 false 
119     num n0(0);
120     cout<<"结果为:";
121     if(sign == -1 && compare(n0) != 0)
122         cout<<"-";                             //输出符号 
123     for(int i=N-1;i>=0;--i)
124     {
125         if(number[i] != 0)
126             flag=true;
127         if(flag)
128             cout<<number[i];
129     }                                          //倒序输出 
130     if(!flag)
131         cout<<"0";                             //防止空输出 
132     cout<<endl;
133 }
134 
135 void num::copy(num &n)
136 {
137     for(int i=0;i<N;++i)
138         number[i]=n.number[i];                 //逐项复制 
139     sign=n.sign;        
140 }
141 
142 void num::move(int t)
143 {
144     if(t > 0)
145     {
146         for(int i=N-1;i>=0;--i)
147         {
148             if(i < t)
149                 number[i]=0;                    //数字末尾(数组开头)加 0 
150             else
151                 number[i]=number[i-t];
152         }
153     }                                           //右移 
154     else if(t < 0)
155     {
156         for(int i=0;i<N;++i)
157         {
158             if(i >= N+t)
159                 number[i]=0;                    //去除多余位上的 0 
160             else
161                 number[i]=number[i-t];
162         }
163     }                                           //左移 
164 }
165 
166 void num::carry()
167 {
168     for(int i=0;i<N-1;++i)
169     {
170         while(number[i] < 0)
171         {
172             --number[i+1];
173             number[i] +=10; 
174         }                                       //借位 
175         while(number[i] > 9)
176         {
177             ++number[i+1];
178             number[i] -=10; 
179         }                                       //进位 
180     }
181 }
182 
183 int num::compare(num &n)
184 {
185     for(int i=N-1;i>=0;--i)
186     {
187         if(number[i] > n.number[i])
188             return 1;
189         else if(number[i] < n.number[i])
190             return -1;
191     }                                           //逐项比较 
192     return 0;
193 }
194 
195 void num::add(num &n)
196 {
197     if((sign * n.sign) == 1)
198         for(int i=0;i<N;++i)
199             number[i] += n.number[i];           //加法 
200     else
201     {
202         bool flag;                              //判断是否为小数减大数 
203         if(compare(n) >= 0)
204             flag=true;
205         else
206             flag=false;
207         for(int i=0;i<N;++i)
208         {
209             if(flag)
210                 number[i] -= n.number[i];
211             else
212                 number[i] = n.number[i]-number[i];            
213         }                                       //始终保持大数减小数(如果是小数减大数,结果取相反数) 
214         if(!flag)
215             sign *=-1; 
216     }                                           //减法 
217     carry();
218 }
219 
220 void num::multiply(num &n)
221 {
222     int x[N]={0};                               //储存结果(方法1) 
223     for(int i=0;i<N;++i)
224         for(int j=0;j<N;++j)
225             x[i+j] += number[i]*n.number[j];    //各项相乘 
226     for(int i=0;i<N;++i)
227         number[i]=x[i];                         //逐项复制 
228     sign *= n.sign;
229     carry();
230 }
231 
232 void num::subtract(num &n)
233 {
234     num nn(n);
235     nn.sign *= -1;                              //转化为加法 
236     add(nn);
237 }
238 
239 void num::divide(num &n)
240 {
241     num x;                                      //储存结果(方法2) 
242     x.sign=sign * n.sign;
243     sign=1;
244     n.sign=1;                                   //处理符号 
245     int length1=leng(),length2=n.leng();
246     if(length2 == 0)
247     {
248         cout<<"无法计算"<<endl;
249         exit(0);
250     }                                           //防止分母为 0 
251     for(int t=length1-length2;t>=0;--t)
252     {
253         num nn(n);
254         nn.move(t);                             //为减少循环次数,采用移位操作。
255         while(compare(nn) >= 0)
256         {
257             subtract(nn);
258             ++x.number[t];
259         }
260     }                                           //计算分子最多能减多少次分母 
261     x.carry();
262     copy(x);
263 }

 

大整数加减乘除 - 初代

标签:color   倒序   比较大小   efi   个数   ++   else   移位操作   AC   

原文地址:https://www.cnblogs.com/rq1b-qsy666/p/9071457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!