程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 高精度運算(運算符重載)

高精度運算(運算符重載)

編輯:C++入門知識

[cpp]
#include <iostream>  
#include <string.h>  
using namespace std; 
const int Base=1000000000; 
const int Capacity=100; 
typedef long long huge; 
 
struct BigInt 

    int Len; 
    int Data[Capacity]; 
    BigInt() : Len(0) {} 
    BigInt (const BigInt &V) : Len(V.Len) 
    { 
        memcpy (Data, V.Data, Len*sizeof*Data); 
    } 
    BigInt(int V) : Len(0) 
    { 
        for(; V>0; V/=Base) Data[Len++]=V%Base; 
    } 
    BigInt &operator=(const BigInt &V) 
    { 
        Len=V.Len; 
        memcpy(Data, V.Data, Len*sizeof*Data); 
        return *this; 
    } 
    int &operator[] (int Index) 
    { 
        return Data[Index]; 
    } 
    int operator[] (int Index) const 
    { 
        return Data[Index]; 
    } 
}; 
int compare(const BigInt &A, const BigInt &B) 

    if(A.Len!=B.Len) return A.Len>B.Len ? 1:-1; 
    int i; 
    for(i=A.Len-1; i>=0 && A[i]==B[i]; i--); 
    if(i<0)return 0; 
    return A[i]>B[i] ? 1:-1; 

 
BigInt operator + (const BigInt &A,const BigInt &B) 

    int i,Carry(0); 
    BigInt R; 
    for(i=0; i<A.Len||i<B.Len||Carry>0; i++) 
    { 
        if(i<A.Len) Carry+=A[i]; 
        if(i<B.Len) Carry+=B[i]; 
        R[i]=Carry%Base; 
        Carry/=Base; 
    } 
    R.Len=i; 
    return R; 

 
BigInt operator - (const BigInt &A,const BigInt &B) 

    int i,Carry(0); 
    BigInt R; 
    R.Len=A.Len; 
    for(i=0; i<R.Len; i++) 
    { 
        R[i]=A[i]-Carry; 
        if(i<B.Len) R[i]-=B[i]; 
        if(R[i]<0) Carry=1,R[i]+=Base; 
        else Carry=0; 
    } 
    while(R.Len>0&&R[R.Len-1]==0) R.Len--; 
    return R; 

 
BigInt operator * (const BigInt &A,const BigInt &B) 

    int i; 
    huge Carry(0); 
    BigInt R; 
    for(i=0; i<A.Len||Carry>0; i++) 
    { 
        if(i<A.Len) Carry+=huge(A[i])*B[i]; 
        R[i]=Carry%Base; 
        Carry/=Base; 
    } 
    R.Len=i; 
    return R; 

istream &operator>>(istream &In,BigInt &V) 

    char Ch; 
    for(V=0; In>>Ch;) 
    { 
        V=V*10+(Ch-'0'); 
        if(In.peek()<=' ') break; 
    } 
    return In; 

ostream &operator<<(ostream &Out,const BigInt &V) 

    int i; 
    Out<<(V.Len==0 ? 0:V[V.Len-1]); 
    for(i=V.Len-2; i>=0; i--) for(int j=Base/10; j>0; j/=10) Out<<V[i]/j; 
    return Out; 

int main() 

    BigInt a,b; 
    cin>>a>>b; 
    cout<<"+"<<endl; 
    cout<<a+b<<endl; 
    if(compare(a, b)>0) cout<<"-"<<endl<<a-b<<endl; 
    else cout<<"-"<<endl<<b-a<<endl; 
    cout<<"*"<<endl<<a*b<<endl; 

#include <iostream>
#include <string.h>
using namespace std;
const int Base=1000000000;
const int Capacity=100;
typedef long long huge;

struct BigInt
{
    int Len;
    int Data[Capacity];
    BigInt() : Len(0) {}
    BigInt (const BigInt &V) : Len(V.Len)
    {
        memcpy (Data, V.Data, Len*sizeof*Data);
    }
    BigInt(int V) : Len(0)
    {
        for(; V>0; V/=Base) Data[Len++]=V%Base;
    }
    BigInt &operator=(const BigInt &V)
    {
        Len=V.Len;
        memcpy(Data, V.Data, Len*sizeof*Data);
        return *this;
    }
    int &operator[] (int Index)
    {
        return Data[Index];
    }
    int operator[] (int Index) const
    {
        return Data[Index];
    }
};
int compare(const BigInt &A, const BigInt &B)
{
    if(A.Len!=B.Len) return A.Len>B.Len ? 1:-1;
    int i;
    for(i=A.Len-1; i>=0 && A[i]==B[i]; i--);
    if(i<0)return 0;
    return A[i]>B[i] ? 1:-1;
}

BigInt operator + (const BigInt &A,const BigInt &B)
{
    int i,Carry(0);
    BigInt R;
    for(i=0; i<A.Len||i<B.Len||Carry>0; i++)
    {
        if(i<A.Len) Carry+=A[i];
        if(i<B.Len) Carry+=B[i];
        R[i]=Carry%Base;
        Carry/=Base;
    }
    R.Len=i;
    return R;
}

BigInt operator - (const BigInt &A,const BigInt &B)
{
    int i,Carry(0);
    BigInt R;
    R.Len=A.Len;
    for(i=0; i<R.Len; i++)
    {
        R[i]=A[i]-Carry;
        if(i<B.Len) R[i]-=B[i];
        if(R[i]<0) Carry=1,R[i]+=Base;
        else Carry=0;
    }
    while(R.Len>0&&R[R.Len-1]==0) R.Len--;
    return R;
}

BigInt operator * (const BigInt &A,const BigInt &B)
{
    int i;
    huge Carry(0);
    BigInt R;
    for(i=0; i<A.Len||Carry>0; i++)
    {
        if(i<A.Len) Carry+=huge(A[i])*B[i];
        R[i]=Carry%Base;
        Carry/=Base;
    }
    R.Len=i;
    return R;
}
istream &operator>>(istream &In,BigInt &V)
{
    char Ch;
    for(V=0; In>>Ch;)
    {
        V=V*10+(Ch-'0');
        if(In.peek()<=' ') break;
    }
    return In;
}
ostream &operator<<(ostream &Out,const BigInt &V)
{
    int i;
    Out<<(V.Len==0 ? 0:V[V.Len-1]);
    for(i=V.Len-2; i>=0; i--) for(int j=Base/10; j>0; j/=10) Out<<V[i]/j;
    return Out;
}
int main()
{
    BigInt a,b;
    cin>>a>>b;
    cout<<"+"<<endl;
    cout<<a+b<<endl;
    if(compare(a, b)>0) cout<<"-"<<endl<<a-b<<endl;
    else cout<<"-"<<endl<<b-a<<endl;
    cout<<"*"<<endl<<a*b<<endl;
}

 

 

2013年7月微軟MVP申請開始啦!        CSDN博客移動開發排行榜      寫“書評”贏下載分!
2013年4月微軟MVP會員名單揭曉!      來極客頭條,贏下載積分      專訪關東升:將人文融入到科技產品中

高精度運算(運算符重載)

分類: Apr.2013 2013-04-07 16:35 79人閱讀 評論(0) 收藏 舉報 理論學習

終於寫好了哇,我的親娘來,滿滿的都是淚啊。。。重載你妹啊。。。。。

 

[cpp] view plaincopyprint?
  1. #include <iostream>   
  2. #include <string.h>   
  3. using namespace std;  
  4. const int Base=1000000000;  
  5. const int Capacity=100;  
  6. typedef long long huge;  
  7.   
  8. struct BigInt  
  9. {  
  10.     int Len;  
  11.     int Data[Capacity];  
  12.     BigInt() : Len(0) {}  
  13.     BigInt (const BigInt &V) : Len(V.Len)  
  14.     {  
  15.         memcpy (Data, V.Data, Len*sizeof*Data);  
  16.     }  
  17.     BigInt(int V) : Len(0)  
  18.     {  
  19.         for(; V>0; V/=Base) Data[Len++]=V%Base;  
  20.     }  
  21.     BigInt &operator=(const BigInt &V)  
  22.     {  
  23.         Len=V.Len;  
  24.         memcpy(Data, V.Data, Len*sizeof*Data);  
  25.         return *this;  
  26.     }  
  27.     int &operator[] (int Index)  
  28.     {  
  29.         return Data[Index];  
  30.     }  
  31.     int operator[] (int Index) const  
  32.     {  
  33.         return Data[Index];  
  34.     }  
  35. };  
  36. int compare(const BigInt &A, const BigInt &B)  
  37. {  
  38.     if(A.Len!=B.Len) return A.Len>B.Len ? 1:-1;  
  39.     int i;  
  40.     for(i=A.Len-1; i>=0 && A[i]==B[i]; i--);  
  41.     if(i<0)return 0;  
  42.     return A[i]>B[i] ? 1:-1;  
  43. }  
  44.   
  45. BigInt operator + (const BigInt &A,const BigInt &B)  
  46. {  
  47.     int i,Carry(0);  
  48.     BigInt R;  
  49.     for(i=0; i<A.Len||i<B.Len||Carry>0; i++)  
  50.     {  
  51.         if(i<A.Len) Carry+=A[i];  
  52.         if(i<B.Len) Carry+=B[i];  
  53.         R[i]=Carry%Base;  
  54.         Carry/=Base;  
  55.     }  
  56.     R.Len=i;  
  57.     return R;  
  58. }  
  59.   
  60. BigInt operator - (const BigInt &A,const BigInt &B)  
  61. {  
  62.     int i,Carry(0);  
  63.     BigInt R;  
  64.     R.Len=A.Len;  
  65.     for(i=0; i<R.Len; i++)  
  66.     {  
  67.         R[i]=A[i]-Carry;  
  68.         if(i<B.Len) R[i]-=B[i];  
  69.         if(R[i]<0) Carry=1,R[i]+=Base;  
  70.         else Carry=0;  
  71.     }  
  72.     while(R.Len>0&&R[R.Len-1]==0) R.Len--;  
  73.     return R;  
  74. }  
  75.   
  76. BigInt operator * (const BigInt &A,const BigInt &B)  
  77. {  
  78.     int i;  
  79.     huge Carry(0);  
  80.     BigInt R;  
  81.     for(i=0; i<A.Len||Carry>0; i++)  
  82.     {  
  83.         if(i<A.Len) Carry+=huge(A[i])*B[i];  
  84.         R[i]=Carry%Base;  
  85.         Carry/=Base;  
  86.     }  
  87.     R.Len=i;  
  88.     return R;  
  89. }  
  90. istream &operator>>(istream &In,BigInt &V)  
  91. {  
  92.     char Ch;  
  93.     for(V=0; In>>Ch;)  
  94.     {  
  95.         V=V*10+(Ch-'0');  
  96.         if(In.peek()<=' ') break;  
  97.     }  
  98.     return In;  
  99. }  
  100. ostream &operator<<(ostream &Out,const BigInt &V)  
  101. {  
  102.     int i;  
  103.     Out<<(V.Len==0 ? 0:V[V.Len-1]);  
  104.     for(i=V.Len-2; i>=0; i--) for(int j=Base/10; j>0; j/=10) Out<<V[i]/j;  
  105.     return Out;  
  106. }  
  107. int main()  
  108. {  
  109.     BigInt a,b;  
  110.     cin>>a>>b;  
  111.     cout<<"+"<<endl;  
  112.     cout<<a+b<<endl;  
  113.     if(compare(a, b)>0) cout<<"-"<<endl<<a-b<<endl;  
  114.     else cout<<"-"<<endl<<b-a<<endl;  
  115.     cout<<"*"<<endl<<a*b<<endl;  
  116. }  
#include <iostream>
#include <string.h>
using namespace std;
const int Base=1000000000;
const int Capacity=100;
typedef long long huge;

struct BigInt
{
    int Len;
    int Data[Capacity];
    BigInt() : Len(0) {}
    BigInt (const BigInt &V) : Len(V.Len)
    {
        memcpy (Data, V.Data, Len*sizeof*Data);
    }
    BigInt(int V) : Len(0)
    {
        for(; V>0; V/=Base) Data[Len++]=V%Base;
    }
    BigInt &operator=(const BigInt &V)
    {
        Len=V.Len;
        memcpy(Data, V.Data, Len*sizeof*Data);
        return *this;
    }
    int &operator[] (int Index)
    {
        return Data[Index];
    }
    int operator[] (int Index) const
    {
        return Data[Index];
    }
};
int compare(const BigInt &A, const BigInt &B)
{
    if(A.Len!=B.Len) return A.Len>B.Len ? 1:-1;
    int i;
    for(i=A.Len-1; i>=0 && A[i]==B[i]; i--);
    if(i<0)return 0;
    return A[i]>B[i] ? 1:-1;
}

BigInt operator + (const BigInt &A,const BigInt &B)
{
    int i,Carry(0);
    BigInt R;
    for(i=0; i<A.Len||i<B.Len||Carry>0; i++)
    {
        if(i<A.Len) Carry+=A[i];
        if(i<B.Len) Carry+=B[i];
        R[i]=Carry%Base;
        Carry/=Base;
    }
    R.Len=i;
    return R;
}

BigInt operator - (const BigInt &A,const BigInt &B)
{
    int i,Carry(0);
    BigInt R;
    R.Len=A.Len;
    for(i=0; i<R.Len; i++)
    {
        R[i]=A[i]-Carry;
        if(i<B.Len) R[i]-=B[i];
        if(R[i]<0) Carry=1,R[i]+=Base;
        else Carry=0;
    }
    while(R.Len>0&&R[R.Len-1]==0) R.Len--;
    return R;
}

BigInt operator * (const BigInt &A,const BigInt &B)
{
    int i;
    huge Carry(0);
    BigInt R;
    for(i=0; i<A.Len||Carry>0; i++)
    {
        if(i<A.Len) Carry+=huge(A[i])*B[i];
        R[i]=Carry%Base;
        Carry/=Base;
    }
    R.Len=i;
    return R;
}
istream &operator>>(istream &In,BigInt &V)
{
    char Ch;
    for(V=0; In>>Ch;)
    {
        V=V*10+(Ch-'0');
        if(In.peek()<=' ') break;
    }
    return In;
}
ostream &operator<<(ostream &Out,const BigInt &V)
{
    int i;
    Out<<(V.Len==0 ? 0:V[V.Len-1]);
    for(i=V.Len-2; i>=0; i--) for(int j=Base/10; j>0; j/=10) Out<<V[i]/j;
    return Out;
}
int main()
{
    BigInt a,b;
    cin>>a>>b;
    cout<<"+"<<endl;
    cout<<a+b<<endl;
    if(compare(a, b)>0) cout<<"-"<<endl<<a-b<<endl;
    else cout<<"-"<<endl<<b-a<<endl;
    cout<<"*"<<endl<<a*b<<endl;
}

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved