Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38564
  • 博文数量: 64
  • 博客积分: 2640
  • 博客等级: 少校
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:15
文章分类
文章存档

2010年(64)

我的朋友
最近访客

分类: C/C++

2010-01-26 13:39:14

2008-10-31 20:23

#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;
}
    


阅读(106) | 评论(0) | 转发(0) |
0

上一篇:金矿问题的两解

下一篇:快速幂取模

给主人留下些什么吧!~~