标签:ring set span opera als idt iostream using amp
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <vector> 5 #include <set> 6 #include <cstdio> 7 #include <algorithm> 8 using namespace std; 9 typedef long long LL; 10 11 12 struct Bign 13 { 14 static const int BASE=100000000; 15 static const int WIDTH=8; 16 vector<int>s; 17 18 Bign(LL n=0){*this=n;} 19 Bign(const string& str){*this=str;} 20 Bign operator =(LL n) 21 { 22 s.clear(); 23 do 24 { 25 s.push_back(n%BASE); 26 n/=BASE; 27 }while(n>0); 28 return *this; 29 } 30 Bign operator =(const string& str) 31 { 32 s.clear(); 33 int x,len=(str.length()-1)/WIDTH+1; 34 for(int i=0;i<len;i++) 35 { 36 int end=str.length()-i*WIDTH; 37 int start=max(0,end-WIDTH); 38 sscanf(str.substr(start,end-start).c_str(),"%d",&x); 39 s.push_back(x); 40 } 41 return *this; 42 } 43 Bign operator +(const Bign& b)const 44 { 45 int len1=s.size(),len2=b.s.size(); 46 int len=max(len1,len2); 47 int ans=0; 48 Bign c;c.s.clear(); 49 for(int i=0;i<len||ans!=0;i++) 50 { 51 if(i<len1) ans+=s[i]; 52 if(i<len2) ans+=b.s[i]; 53 c.s.push_back(ans%BASE); 54 ans/=BASE; 55 } 56 return c; 57 } 58 Bign operator -(const Bign& b)const 59 { 60 61 int len1=s.size(),len2=b.s.size(); 62 Bign c;c.s.clear(); 63 int ans=0,t=0; 64 for(int i=0;i<len1;i++) 65 { 66 if(i<len2) ans=s[i]-b.s[i]+t; 67 else ans=s[i]+t; 68 if(ans<0) 69 { 70 ans+=BASE;t=-1; 71 } 72 else t=0; 73 if(ans>0)c.s.push_back(ans); 74 } 75 return c; 76 } 77 Bign operator *(const Bign& b)const 78 { 79 Bign c; 80 int len1=s.size(),len2=b.s.size(); 81 for(int i=0;i<len2;i++) 82 { 83 for(int j=0;j<len1;j++) 84 { 85 Bign ans=(LL)b.s[i]*s[j]; 86 for(int k=0;k<i+j;k++) 87 ans.s.insert(ans.s.begin(),0); 88 c=c+ans; 89 } 90 } 91 return c; 92 } 93 94 bool operator <(const Bign& b)const 95 { 96 if(s.size()!=b.s.size()) return s.size()<b.s.size(); 97 for(int i=s.size()-1;i>=0;i--) 98 if(s[i]!=b.s[i]) return s[i]<b.s[i]; 99 return false; 100 } 101 bool operator ==(const Bign& b)const 102 { 103 if(s.size()!=b.s.size()) return false; 104 for(int i=s.size()-1;i>=0;i--) 105 if(s[i]!=b.s[i]) return false; 106 return true; 107 } 108 }; 109 ostream& operator <<(ostream& out,const Bign& a) 110 { 111 out<<a.s.back(); 112 char buf[10]; 113 int len=a.s.size(); 114 for(int i=len-2;i>=0;i--) 115 { 116 sprintf(buf,"%08d",a.s[i]); 117 out<<buf; 118 } 119 return out; 120 } 121 LL BtoL(const Bign& a) 122 { 123 LL c; 124 char buf[10]; 125 string ss=""; 126 int len=a.s.size(); 127 sprintf(buf,"%d",a.s.back());ss+=(string)buf; 128 for(int i=len-2;i>=0;i--) 129 { 130 sprintf(buf,"%08d",a.s[i]); 131 ss+=(string)buf; 132 } 133 sscanf(ss.c_str(),"%lld",&c); 134 return c; 135 } 136 istream& operator >>(istream& in,Bign& a) 137 { 138 string s; 139 in>>s; 140 a=s; 141 return in; 142 }
标签:ring set span opera als idt iostream using amp
原文地址:http://www.cnblogs.com/Kiraa/p/6076059.html