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

超 短 高精度 bign 模板

时间:2014-11-03 20:36:53      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   for   sp   

终于会了,233

bubuko.com,布布扣
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 using namespace std;
  5 struct bign
  6 {
  7     int len;
  8     int num[1501];
  9     bool flag;
 10     bign(){len=1;flag=0;memset(num,0,sizeof num);}
 11     bign(int x)
 12     {
 13         if(!x)return;
 14         len=0;
 15         while(x)
 16         {
 17             num[++len]=x%10;x/=10;
 18         }
 19     }
 20 };
 21 bool operator < (bign a,bign b)
 22 {
 23     if(a.len<b.len)return 1;
 24     if(a.len>b.len)return 0;
 25     for(int i=a.len;i>=1;i--)
 26         if(a.num[i]>b.num[i])return 0;
 27     return 1;
 28 }
 29 bool operator == (bign a,bign b)
 30 {
 31     if(a.len!=b.len)return 0;
 32     for(int i=1;i<=a.len;i++)
 33         if(a.num[i]!=b.num[i])return 0;
 34     return 1;
 35 }
 36 bign operator +(bign &A,bign &B)
 37 {
 38     bign ret;
 39     int i=1,x=0;
 40     while(i<=A.len || i<=B.len)
 41     {
 42         ret.num[i]=A.num[i]+B.num[i]+x;
 43         x=ret.num[i]/10;
 44         ret.num[i]%=10;
 45         i++;
 46     }
 47     ret.num[i]=x;
 48     ret.len=i;
 49     if(!ret.num[ret.len])ret.len--;
 50     return ret;
 51 }
 52 bign operator * (bign a,bign b)
 53 {
 54     bign ans;
 55     int len=a.len+b.len;
 56     for(int i=1;i<=a.len;i++)
 57     {
 58         int x=0;
 59         for(int j=1;j<=b.len;j++)
 60         {
 61             ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
 62             x=ans.num[i+j-1]/10;
 63             ans.num[i+j-1]%=10;
 64         }
 65         ans.num[i+b.len]+=x;
 66     }
 67     while(!ans.num[len] && len>1)len--;
 68     ans.len=len;
 69     return ans;
 70 }
 71 bign operator - (bign a,bign b)
 72 {
 73     bign ans;
 74     if(a==b)return ans;
 75     if(b<a)
 76     {
 77         for(int i=1;i<=a.len;i++)
 78         {
 79             if(a.num[i]<0)
 80                 a.num[i]+=10,a.num[i+1]--;
 81             ans.num[i]=a.num[i]-b.num[i];
 82             if(ans.num[i]<0)
 83             {
 84                 ans.num[i]+=10;
 85                 a.num[i+1]--;//向a的高位借位
 86             }
 87         }
 88     }
 89     else
 90     {
 91         ans.flag=1;// this number(I mean the ans) is smaller than zero
 92         for(int i=1;i<=b.len;i++)
 93         {
 94             if(b.num[i]<0)
 95             {
 96                 b.num[i]+=10;b.num[i+1]--;
 97             }
 98             ans.num[i]=b.num[i]-a.num[i];
 99             if(ans.num[i]<0)
100             {
101                 ans.num[i]+=10;
102                 b.num[i+1]--;
103             }
104         }
105     }
106     int len=max(a.len,b.len);
107     while(ans.num[len]<=0 && len>1)len--;
108     ans.len=len;
109     return ans;
110 }
111 bign get()
112 {
113     bign ans;
114     string s;
115     cin>>s;
116     int l=s.length();
117     ans.len=l;
118     for(int i=0;i<ans.len;i++)ans.num[ans.len-i]=s[i]-48;
119     return ans;
120 }
121 void out(bign x)
122 {
123     if(x.flag)cout<<"-";
124     for(int i=x.len;i>=1;i--)
125     {
126         cout<<x.num[i];
127     }
128 }
129 int main()
130 {
131     return 0;
132 }
View Code

 

超 短 高精度 bign 模板

标签:style   blog   http   io   color   ar   os   for   sp   

原文地址:http://www.cnblogs.com/Skyvot/p/4072036.html

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