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

大数模板

时间:2015-03-13 10:43:56      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
  1 #include <stdio.h>
  2 #include <string.h> 
  3 #include <stdlib.h> 
  4 #include <math.h>
  5 #include <assert.h>  
  6 #include <ctype.h> 
  7 #include <map>
  8 #include <string>
  9 #include <set>
 10 #include <bitset>
 11 #include <utility>
 12 #include <algorithm>
 13 #include <vector>
 14 #include <stack>
 15 #include <queue>
 16 #include <iostream>
 17 #include <fstream>
 18 #include <list>
 19 using  namespace  std;      
 20      
 21 const  int MAXL = 500;      
 22 struct  BigNum      
 23 {      
 24     int  num[MAXL];      
 25     int  len;      
 26 };      
 27      
 28 //高精度比较 a > b return 1, a == b return 0; a < b return -1;      
 29 int  Comp(BigNum &a, BigNum &b)      
 30 {      
 31     int  i;      
 32     if(a.len != b.len) return (a.len > b.len) ? 1 : -1;      
 33     for(i = a.len-1; i >= 0; i--)      
 34         if(a.num[i] != b.num[i]) return  (a.num[i] > b.num[i]) ? 1 : -1;      
 35     return  0;      
 36 }      
 37      
 38 //高精度加法      
 39 BigNum  Add(BigNum &a, BigNum &b)      
 40 {      
 41     BigNum c;      
 42     int  i, len;      
 43     len = (a.len > b.len) ? a.len : b.len;      
 44     memset(c.num, 0, sizeof(c.num));      
 45     for(i = 0; i < len; i++)      
 46     {      
 47         c.num[i] += (a.num[i]+b.num[i]);      
 48         if(c.num[i] >= 10)      
 49         {      
 50             c.num[i+1]++;      
 51             c.num[i] -= 10;      
 52         }      
 53     }      
 54     if(c.num[len])
 55         len++;      
 56     c.len = len;      
 57     return  c;      
 58 }      
 59 //高精度减法,保证a >= b      
 60 BigNum Sub(BigNum &a, BigNum &b)      
 61 {      
 62     BigNum  c;      
 63     int  i, len;      
 64     len = (a.len > b.len) ? a.len : b.len;      
 65     memset(c.num, 0, sizeof(c.num));      
 66     for(i = 0; i < len; i++)      
 67     {      
 68         c.num[i] += (a.num[i]-b.num[i]);      
 69         if(c.num[i] < 0)      
 70         {      
 71             c.num[i] += 10;      
 72             c.num[i+1]--;      
 73         }      
 74     }      
 75     while(c.num[len] == 0 && len > 1)
 76         len--;      
 77     c.len = len;      
 78     return  c;      
 79 }      
 80 //高精度乘以低精度,当b很大时可能会发生溢出int范围,具体情况具体分析      
 81 //如果b很大可以考虑把b看成高精度      
 82 BigNum Mul1(BigNum &a, int  &b)      
 83 {      
 84     BigNum c;      
 85     int  i, len;      
 86     len = a.len;      
 87     memset(c.num, 0, sizeof(c.num));      
 88     //乘以0,直接返回0      
 89     if(b == 0)       
 90     {      
 91         c.len = 1;      
 92         return  c;      
 93     }      
 94     for(i = 0; i < len; i++)      
 95     {      
 96         c.num[i] += (a.num[i]*b);      
 97         if(c.num[i] >= 10)      
 98         {      
 99             c.num[i+1] = c.num[i]/10;      
100             c.num[i] %= 10;      
101         }      
102     }      
103     while(c.num[len] > 0)      
104     {      
105         c.num[len+1] = c.num[len]/10;      
106         c.num[len++] %= 10;      
107     }      
108     c.len = len;       
109     return  c;      
110 }      
111      
112 //高精度乘以高精度,注意要及时进位,否则肯能会引起溢出,但这样会增加算法的复杂度,      
113 //如果确定不会发生溢出, 可以将里面的while改成if      
114 BigNum  Mul2(BigNum &a, BigNum &b)      
115 {      
116     int i, j, len = 0;      
117     BigNum  c;      
118     memset(c.num, 0, sizeof(c.num));      
119     for(i = 0; i < a.len; i++)
120     {
121         for(j = 0; j < b.len; j++)      
122         {      
123             c.num[i+j] += (a.num[i]*b.num[j]);      
124             if(c.num[i+j] >= 10)      
125             {      
126                 c.num[i+j+1] += c.num[i+j]/10;      
127                 c.num[i+j] %= 10;      
128             }      
129         }
130     }
131     len = a.len+b.len-1;      
132     while(c.num[len-1] == 0 && len > 1)
133         len--;      
134     if(c.num[len])
135         len++;      
136     c.len = len;      
137     return  c;      
138 }      
139      
140 //高精度除以低精度,除的结果为c, 余数为f      
141 void Div1(BigNum &a, int &b, BigNum &c, int &f)      
142 {      
143     int  i, len = a.len;      
144     memset(c.num, 0, sizeof(c.num));      
145     f = 0;      
146     for(i = a.len-1; i >= 0; i--)      
147     {      
148         f = f*10+a.num[i];      
149         c.num[i] = f/b;      
150         f %= b;      
151     }      
152     while(len > 1 && c.num[len-1] == 0)
153         len--;      
154     c.len = len;      
155 }      
156 //高精度*10      
157 void  Mul10(BigNum &a)      
158 {      
159     int  i, len = a.len;      
160     for(i = len; i >= 1; i--)      
161         a.num[i] = a.num[i-1];      
162     a.num[i] = 0;      
163     len++;      
164     //if a == 0      
165     while(len > 1 && a.num[len-1] == 0)
166         len--;      
167 }      
168      
169 //高精度除以高精度,除的结果为c,余数为f      
170 void Div2(BigNum &a, BigNum &b, BigNum &c, BigNum &f)      
171 {      
172     int  i, len = a.len;      
173     memset(c.num, 0, sizeof(c.num));      
174     memset(f.num, 0, sizeof(f.num));      
175     f.len = 1;      
176     for(i = len-1;i >= 0;i--)      
177     {      
178         Mul10(f);      
179         //余数每次乘10      
180         f.num[0] = a.num[i];      
181         //然后余数加上下一位      
182         ///利用减法替换除法      
183         while(Comp(f, b) >= 0)      
184         {
185             f = Sub(f, b);      
186             c.num[i]++;      
187         }      
188     }      
189     while(len > 1 && c.num[len-1] == 0)
190         len--;      
191     c.len = len;      
192 }   
193 void  print(BigNum &a)   //输出大数   
194 {      
195     int  i;      
196     for(i = a.len-1; i >= 0; i--)      
197         printf("%d", a.num[i]);      
198     puts("");      
199 }      
200 //将字符串转为大数存在BigNum结构体里面      
201 BigNum ToNum(char *s)      
202 {      
203     int i, j;      
204     BigNum  a;      
205     a.len = strlen(s);      
206     for(i = 0, j = a.len-1; s[i] != \0; i++, j--)      
207         a.num[i] = s[j]-0;      
208     return  a;      
209 }      
210      
211 void Init(BigNum &a, char *s, int &tag)   //将字符串转化为大数
212 {   
213     int  i = 0, j = strlen(s); 
214     if(s[0] == -)
215     {
216         j--;
217         i++;
218         tag *= -1;
219     }
220     a.len = j;
221     for(; s[i] != \0; i++, j--)
222         a.num[j-1] = s[i]-0;
223 }   
224   
225 int main(void)      
226 {      
227     BigNum a, b;   
228     char  s1[100], s2[100];   
229     while(scanf("%s %s", s1, s2) != EOF)   
230     {   
231         int tag = 1;   
232         Init(a, s1, tag);    //将字符串转化为大数
233         Init(b, s2, tag);   
234         a = Mul2(a, b);   
235         if(a.len == 1 && a.num[0] == 0)   
236         {   
237             puts("0");   
238         }   
239         else    
240         {   
241             if(tag < 0) putchar(-);   
242             print(a);   
243         }   
244     }   
245     return 0;   
246 }
View Code

 

大数模板

标签:

原文地址:http://www.cnblogs.com/xuesen1995/p/4334378.html

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