⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 大明a+b .cpp

📁 杭电acm解题报告2001---2099.
💻 CPP
字号:
/**** **** **** **** **** ****
*    Function Name :        BigNumber
*    Description :            BigNumber's HPC
*    Author :                HuangWei
*    Last Edited :            07.4.11
**** **** **** **** **** ****/
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <algorithm>

#define BASE     10    // 基数
#define DIG        1100    // 存储
using namespace std;

class BigNumber
{
private:
     int data[DIG];            // 数据区
     int len;                // 记录长度
public:
     BigNumber()     {len=1;memset(data,0,sizeof(data));data[0]=1;}
     BigNumber(int);          // 输入默认十进制
     BigNumber(char*);
     BigNumber(const BigNumber &);
     // 类型转换
     BigNumber & Num_BNum(int);
     BigNumber & Str_BNum(char*);
     int Int();
     string Str();
     // HPC
     BigNumber & Add(const BigNumber &);
     BigNumber & Sub(const BigNumber &);
     BigNumber & Mul(const BigNumber &);
     BigNumber & Div(int);
     BigNumber & Mod(int);
     BigNumber & operator=(const BigNumber &);
     int Bigger(const BigNumber &) const;

     BigNumber operator + (const BigNumber &);
     BigNumber operator - (const BigNumber &);
     BigNumber operator * (const BigNumber &);
     BigNumber operator / (int);
     BigNumber operator % (int);

     BigNumber & operator += (const BigNumber &);
     BigNumber & operator -= (const BigNumber &);
     BigNumber & operator *= (const BigNumber &);
     BigNumber & operator /= (int);
     BigNumber & operator %= (int);
};

BigNumber & BigNumber::Num_BNum(int b)
{
     len=1;     memset(data,0,sizeof(data));
     data[0] = 1;
     if(b < 0) {
          b = -b;
          data[0] = -1;
     }
     while(b > 0) {
          data[ len++ ] = b % BASE;
          b /= BASE;
     }
     return *this;
}

BigNumber & BigNumber::Str_BNum(char* sb)
{
     int t=0, d=1, b=0, slen=strlen(sb), i;
     len=1;     memset(data,0,sizeof(data));
     data[0] = 1;
     if(sb[0] == '-')     data[0] = -1, b=1;
     for(i=slen-1; i>=b ;i--) {
          while(t >= BASE || d > BASE) {
               data[ len++ ] = t % BASE;
               t /= BASE;
               d = 10;
          }
          t += (sb[i]-'0') * d;
          d *= 10;
     }
     while(t > 0) {
          data[ len++ ] = t % BASE;
          t /= BASE;
     }
     return *this;
}

int BigNumber::Int() 
{
     istringstream sin;
     int v;
     sin.str( this->Str() );
     sin >> v;
     return v;
}

string BigNumber::Str()
{
     int i,base_len=0;
     ostringstream sout;
     if(len == 1) {
          sout << '0';
          //sout << endl;
          return sout.str();
     }
     if(data[0] < 0)     sout << "-";
     sout << data[len-1];
     i = BASE;
     while(i > 1) {
          base_len++;
          i /= 10;
     }
     for(i=len-2; i>0 ;i--) {
          sout.width(base_len);
          sout.fill('0');
          sout << data[i];
     }
     //sout << endl;
     return sout.str();
}

BigNumber::BigNumber(int b)
{this->Num_BNum(b);}

BigNumber::BigNumber(char* sb)
{this->Str_BNum(sb);}
// -1 a<b, 0 a==b, 1 a>b
BigNumber::BigNumber(const BigNumber & b)
{len = b.len;     memcpy(data,b.data,sizeof(data));}

int BigNumber::Bigger(const BigNumber & b) const
{
     int i,flag;
     if(data[0] ==1 && b.data[0] ==1)          flag = 1;
     else if(data[0] ==1 && b.data[0] ==-1)     return 1;
     else if(data[0] ==-1 && b.data[0] ==1)     return -1;
     else                                             flag = -1;

     if(len > b.len)     return flag;
     else if(len == b.len) {
          for(i=len-1; i>0 ;i--)
               if(data[i] > b.data[i])     return flag;
     }
     if(i == 0)     return 0;
     return -flag;
}

BigNumber & BigNumber::Add(const BigNumber & b)
{
     int i;
     if(data[0] * b.data[0] != 1) {
          data[0] = -data[0];
          Sub(b);
          data[0] = -data[0];
          return *this;
     }
     len= len > b.len ? len : b.len;
     for(i=1; i<len ;i++) {
          data[i] += b.data[i];
          if(data[i] >= BASE) {
               data[i+1]++;
               data[i] -= BASE;
          }
     }
     if(data[i] > 0)     len = i+1;
     return *this;
}

BigNumber & BigNumber::Sub(const BigNumber & b)
{
     int i;
     if(data[0] * b.data[0] != 1) {
          data[0] = -data[0];
          Add(b);
          data[0] = -data[0];
          return *this;
     }
     len= len > b.len ? len : b.len;
     for(i=1; i<len ;i++) {
          data[i] -= b.data[i];
          if(data[i] < 0) {
               data[i+1]--;
               data[i] += BASE;
          }
     }
     if(data[len] < 0) {
          for(i=0; i<=len ;i++)
               data[i] = -data[i];
          for(i=1; i<len ;i++)
               if(data[i] < 0) {
                    data[i+1]--;
                    data[i] += BASE;
               }
     }
     while(data[len-1] == 0)     len--;
     return *this;
}

BigNumber & BigNumber::Mul(const BigNumber & b)
{
     BigNumber bt;
     int i,j,up;
     int temp,temp1;

     bt.data[0] = data[0] * b.data[0];
     for(i=1; i<len ;i++) {
          up = 0;
          for(j=1; j<b.len ;j++) {
               temp = data[i] * b.data[j] + bt.data[i+j-1] + up;
               if(temp >= BASE) {
                    temp1 = temp % BASE;
                    up = temp / BASE;
                    bt.data[i+j-1] = temp1;
               }
               else {
                    up = 0;
                    bt.data[i+j-1] = temp;
               }
          }
          if(up != 0)     bt.data[i+j-1] = up;
     }
     bt.len = i+j;
     while(bt.data[bt.len-1] == 0) bt.len--;
     *this=bt;
     return *this;
}

BigNumber & BigNumber::Div(int b)
{
     BigNumber bt;
     int i,down = 0;
     
     if(b < 0)     bt.data[0] = -data[0] , b = -b;
     else          bt.data[0] = data[0];
     for(i=len-1; i>=1 ;i--) {
          bt.data[i] = (data[i] + down * BASE) / b;
          down = data[i] + down * BASE - bt.data[i] * b;
     }
     bt.len = len;
     while(bt.data[bt.len-1] == 0)     bt.len--;
     *this=bt;
     return *this;
}

BigNumber & BigNumber::Mod(int b)
{
     int temp = 0, up = 0, i;
     for(i=len-1; i>=1 ;i--) {
          temp = data[i];
          temp += up * BASE;
          up = temp % b;
     }
     if(data[0] < 0)     up = -up;
     *this = up;
     return *this;
}

BigNumber & BigNumber::operator = (const BigNumber & b)
{len = b.len;     memcpy(data,b.data,sizeof(data));     return *this;}

BigNumber BigNumber::operator + (const BigNumber & b)
{BigNumber bt=*this;     return bt.Add(b);}

BigNumber BigNumber::operator - (const BigNumber & b)
{BigNumber bt=*this;     return bt.Sub(b);}

BigNumber BigNumber::operator * (const BigNumber & b)
{BigNumber bt=*this;     return bt.Mul(b);}

BigNumber BigNumber::operator / (int b)
{BigNumber bt=*this;     return bt.Div(b);}

BigNumber BigNumber::operator % (int b)
{BigNumber bt=*this;     return bt.Mod(b);}

BigNumber & BigNumber::operator += (const BigNumber & b)
{return this->Add(b);}

BigNumber & BigNumber::operator -= (const BigNumber & b)
{return this->Sub(b);}

BigNumber & BigNumber::operator *= (const BigNumber & b)
{return this->Mul(b);}

BigNumber & BigNumber::operator /= (int b)
{return this->Div(b);}

BigNumber & BigNumber::operator %= (int b)
{return this->Mod(b);}



char n1[1100],n2[1100];

int fix(char * ps)
{
    int i=0,j,dig;
    int len=strlen(ps);
    if(ps[0]=='.')
    {
        for(i=len;i>=0;i--)
        {
            ps[i+1] = ps[i];
        }
        ps[0] ='0';
    }
    if(ps[len-1]=='.')
        ps[len-1]=0;


    len=strlen(ps);
    bool flag=false;
    for(i=0;i<len;i++)
        if(ps[i]=='.')
        {
            flag=true;
            i++;
            break;
        }
    dig = len -i;
    if(flag)
        for( ;i<=len;i++)
        {
            ps[i-1] = ps[i];
        }
    return dig;
}

int main()
{
    int n;
    char str[1100];
    string ans;
    int lena,lenb,step,max_len,len;
    BigNumber a,b,sum;
    while (scanf("%s %s",n1,n2)==2) {
        lena=fix(n1);
        lenb=fix(n2);
        max_len =lena ;
        if(lena>lenb)
        {
            step = lena - lenb;
            len = strlen(n2);
            for(int i=0;i<step;i++)
                n2[i+len] = '0';
            n2[i+len] = 0;
            max_len = lena;
        }
        else if(lena<lenb)
        {
            step = lenb - lena;
            len = strlen(n1);
            for(int i=0;i<step;i++)
                n1[i+len] = '0';
            n1[i+len] = 0;
            max_len = lenb;
        }
        a= n1;
        b= n2;
        sum = a+b;
        ans = sum.Str();
        len = ans.length() - max_len;
        for(int i=0;i<len;i++)
            printf("%c",ans[i]);
        int j=i;
        if(max_len!=0)
        {
            bool flag=false;
            for(i=ans.length()-1;i>=j;i--)
            {
                if(ans[i]!='0')
                {
                    flag =true;
                    break;
                }
            }
            if(flag)
            {
                printf(".");
                for(;j<=i;j++)
                {
                    printf("%c",ans[j]);
                }
            }
        }
        printf("\n");
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -