folstfolst
全部博文(64)
2010年(64)
Phyllis6
分类: C/C++
2010-01-26 13:39:14
#include<iostream> #include<cmath> using namespace std; const int H = 10000; struct CompressBigNum{ int len,num[30]; CompressBigNum(){ memset(num,0,sizeof(num)); len = 1; } CompressBigNum(int n); }; CompressBigNum::CompressBigNum(int n){ int i; len = (int)( log10(double(n))/log10(double(H)) ) + 1; memset(num,0,sizeof(num)); num[0] = n; for(i=0;i<len;i++){ num[i+1] += num[i]/H; num[i] %= H; } if(num[len]>0) len++; } CompressBigNum operator+(CompressBigNum a,const CompressBigNum& b){ int len = a.len>b.len?a.len:b.len; int i; a.len = len; for(i=0;i<len;i++) a.num[i] += b.num[i]; for(i=0;i<len;i++){ a.num[i+1] += a.num[i]/H; a.num[i] %= H; } if(a.num[len]>0) len++; return a; } CompressBigNum operator*(const CompressBigNum& a,const CompressBigNum& b){ CompressBigNum c; int len = a.len + b.len; int i,j; for(i=0;i<a.len;i++) for(j=0;j<b.len;j++) c.num[i+j] += a.num[i]*b.num[j]; for(i=0;i<len;i++){ c.num[i+1] += c.num[i]/H; c.num[i] %= H; } while(c.num[len]==0) len--; c.len = len+1; return c; } bool operator>(const CompressBigNum& a,const CompressBigNum& b){ if(a.len!=b.len) return a.len>b.len; int i = a.len-1; while(a.num[i]==b.num[i]&&i>=0) i--; if(i==-1) return false; return a.num[i] > b.num[i]; } istream& operator>>(istream& in,CompressBigNum& a){ int n; in>>n; a = n; return in; } ostream& operator<<(ostream& out,const CompressBigNum& a){ for(int i=a.len-1;i>=0;i--) out<<a.num[i]; return out; } int main(void){ CompressBigNum a,b; cin>>a>>b; cout<<a+b<<" "<<a*b<<" "; cout<<boolalpha<<(a+b>a*b); system("pause"); return 0; }
上一篇:金矿问题的两解
下一篇:快速幂取模
登录 注册