高精度模板

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <ctime>
  5 #include <cstring>
  6 using namespace std;
  7 #define maxsize 1005
  8 //建立一个结构体
  9 struct hp
 10 {
 11     int len;//用来存储转化为整型后的长度
 12     int s[maxsize+1];//用来存储每一位
 13 };
 14 //copy  函数把b  copy给a
 15 void copy(hp &a,hp &b)
 16 {
 17     a.len=b.len;
 18     for(int i=1;i<=b.len;i++)
 19         a.s[i]=b.s[i];
 20 }
 21 //输入函数
 22 void input(hp &a,string str)
 23 {
 24     int i;
 25     while(str[0]=='0' && str.size()!=1)
 26         str.erase(0,1);//删除第一个元素
 27     a.len=(int)str.size();//把str的长度复制给a的len
 28     for(i=1;i<=a.len;++i)
 29         a.s[i]=str[a.len-i]-48;//a数组存储每一位,并且字符要逆向存入数组
 30     for (i=a.len+1;i<=maxsize;++i)
 31         a.s[i]=0;//剩下的为0
 32 }
 33 //输出函数
 34 void print(const hp &y)
 35 {
 36     int i;
 37     for(i=y.len;i>=1;i--)//注意输出是要后面向前输出i=y.len
 38         printf("%d",y.s[i]);
 39     cout<<endl;
 40 }
 41 
 42 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 43 1 高精度加法
 44 void plusk(const hp &a,const hp &b,hp &c)
 45 {
 46     int i,len;
 47     for(i=1;i<=maxsize;i++)
 48             c.s[i]=0;//初始化数组可以用memset
 49     //len为两者中的最大值
 50     if(a.len>b.len)
 51            len=a.len;
 52     else
 53           len=b.len;
 54     //计算
 55     for(i=1;i<=len;i++)
 56     {
 57         c.s[i]+=a.s[i]+b.s[i];//注意这里是c.s[i]+=a.s[i]+b.s[i]
 58         if(c.s[i]>=10)//考虑进位思想
 59         {
 60             c.s[i]-=10;
 61             c.s[i+1]++;
 62         }
 63     }
 64     if(c.s[len+1]>0) //最后一位有进位情况
 65          len++;
 66     c.len=len;
 67 }
 68 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 69 2 高精度减法
 70 void subtract(const hp &a,const hp &b,hp &c)
 71 {
 72     int i,len;
 73     for(i=1;i<=maxsize;i++)
 74           c.s[i]=0;//初始化为0
 75     //求最大的长度
 76     if(a.len>b.len)
 77           len=a.len;
 78     else
 79          len=b.len;
 80     //减法计算
 81     for(i=1;i<=len;i++)
 82     {
 83         c.s[i]+=a.s[i]-b.s[i];//这个地方注意c.s[i]+=a.s[i]-b.s[i]
 84         if(c.s[i]<0)//如果小于0则要向前借位
 85         {
 86             c.s[i]+=10;//这里对应加10
 87             c.s[i+1]--;//前一位减1
 88         }
 89     }
 90     while(len>1&&c.s[len]==0)
 91            len--;//舍去前面的0
 92     c.len=len;
 93 }
 94 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 95 3 高精度比较
 96 int compare(const hp &a,const hp &b)
 97 {
 98     int len;
 99     //求最大的长度
100     if(a.len>b.len)
101         len=a.len;
102     else
103         len=b.len;
104     while(len>0 && a.s[len]==b.s[len])
105         len--;
106     if(len==0) //如果两个相等
107         return 0;
108     else
109         return a.s[len]-b.s[len];//a.s[len]-b.s[len]如果是负数则说明a小于b,反之
110 }
111 
112 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
113 4高精度*单精度
114 void multiply(const hp &a,int b,hp &c)
115 {
116     int i,len;
117     for(i=1;i<=maxsize;i++)
118          c.s[i]=0;//初始化为0
119     len=a.len;
120     //计算乘法
121     for(i=1;i<=len;i++)
122     {
123         c.s[i]+=a.s[i]*b;//把每一位乘上b存到结构体C里,这里是 c.s[i]+=a.s[i]*b
124         //进位思想
125         c.s[i+1]+=c.s[i]/10;
126         c.s[i]%=10;
127     }
128     //处理进位
129     len++;
130     while(c.s[len]>=10)
131     {
132         //进位运算
133         c.s[len+1]+=c.s[len]/10;
134         c.s[len]%=10;
135         len++;
136     }
137     while(len>1&&c.s[len]==0)
138           len--;//舍去前面没用的0
139     c.len=len;
140 }
141 
142 
143 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
144 5高精度*高精度
145 void multiplyh(const hp &a,const hp &b,hp &c)
146 {
147     int i,j,len;
148     for(i=1;i<=maxsize;i++)
149          c.s[i]=0;//初始化为0
150     //计算
151     for(i=1;i<=a.len;i++)
152         for(j=1;j<=b.len;j++)
153         {
154             c.s[i+j-1]+=a.s[i]*b.s[j];//注意这里的计算
155             c.s[i+j]+=c.s[i+j-1]/10;
156             c.s[i+j-1]%=10;
157         }
158     ////////////////////////////
159     len=a.len+b.len+1;
160     while(len>1&&c.s[len]==0)
161            len--;//舍去前面没用的0
162     c.len=len;
163 }
164 
165 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
166 6高精度/单精度  {d为余数}
167 void divide(const hp &a,int b,hp &c,int &d)   
168 {
169     int i,len;
170     for(i=1;i<=maxsize;i++)
171          c.s[i]=0;//初始化为0
172     len=a.len;
173     d=0;
174     //注意除法的计算要从高位向下除
175     for(i=len;i>=1;i--)
176     {
177         d=d*10+a.s[i];//计算
178         c.s[i]=d/b;//存入c中
179         d%=b;//d为于数
180     }
181     ////////////////////////////////
182     while(len>1&&c.s[len]==0)
183         len--;//舍去前面没用的0
184     c.len=len;
185 }
186 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
187 7 高精度*10
188 void multiply10(hp &a)    
189 {
190     int i;
191     //乘上10就是每一位都向前移动,而s[1]=0;
192     for(i=a.len;i>=1;i--)
193         a.s[i+1]=a.s[i];
194     a.s[1]=0;
195     //////////////////////
196     a.len++;
197     while(a.len>1&&a.s[a.len]==0)
198         a.len--;//舍去前面没用的0
199 }
200 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
201 8   高精度/高精度  {d为余数}
202 void divideh(const hp &a,const hp &b,hp &c,hp &d)  
203 {
204     hp e;
205     int i,len;
206     //初始化
207     for(i=1;i<=maxsize;i++)
208     {
209         c.s[i]=0;
210         d.s[i]=0;
211     }
212     ////////////////////////////
213     len=a.len;
214     d.len=1;
215     for(i=len;i>=1;i--)
216     {
217         multiply10(d);//高进度乘上10
218         d.s[1]=a.s[i];
219         while(compare(d,b)>=0)
220         {
221             subtract(d,b,e);
222             d=e;
223             c.s[i]++;
224         }
225     }
226     while(len>1&&c.s[len]==0)
227           len--;//舍去前面没用的0
228     c.len=len;
229 }
230 ///////////////////////////////////////////////////////////////////
231 hp sum[1003];//创建一个结构体数组
232 int main()
233 {
234             int n=1002;
235         hp a, b,c,tmp;
236         c.len=0;
237         a.s[1]=1;
238         for(int i=2;i<1002;i++)
239         {
240                      b.s[i]=0;    
241                      a.s[i]=0;
242                  }
243         for(int i=0;i<1002;i++)
244         {
245             sum[i].len=1;
246             memset(sum[i].s,0,sizeof(sum[i].s));
247         }
248         a.len=1;
249         b.s[1]=2    ;
250         sum[1].s[1]=2;
251         sum[2].s[1]=1;
252         b.len=1;
253         int pos=2;
254         if(n>2)
255         {    
256                    for(int i=1;i<n;i++)
257                   {
258                         plusk(a,b,c);
259                             copy(sum[pos],c);
260                         int pos2;
261                         pos2=pos+1;
262                        copy(a,b);
263                        copy(b,c);
264                       pos++;
265                   }
266         }
267            while(cin>>n)
268            {
269              print(sum[n]);
270            }
271               return 0;
272 }

原文链接:http://blog.csdn.net/cgl1079743846/article/details/7649244

posted @ 2012-08-19 08:25  山路水桥  阅读(200)  评论(0编辑  收藏  举报