zoukankan      html  css  js  c++  java
  • 大数

    ps:实现是实现了,但错误未知,甚用。

    ps:代码有点臃肿,凑和用着。

    ps:能用java就用java,其次手写,最后套用这个。

    整数:

    1.int数组

    /*
    整数大数
    int数组实现
    */
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    
    #define MAXN 9999//万进制
    #define DLEN 4//4位
    
    class BigNum{
    private:
        int a[500];//可以控制大数位数(500*4)
        int len;//大数长度
    public:
        BigNum(){//构造函数
            len=1;
            memset(a,0,sizeof(a));
        }
        BigNum(const int);//将int转化为大数
        BigNum(const char *);//将字符串转化为大数
        BigNum(const BigNum &);//拷贝构造函数
        BigNum &operator=(const BigNum &);//重载赋值运算符,大数之间赋值
    
        BigNum operator+(const BigNum &)const;//大数+大数
        BigNum operator-(const BigNum &)const;//大数-大数
        BigNum operator*(const BigNum &)const;//大数*大数
        BigNum operator/(const int &)const;//大数/int
    
        BigNum operator^(const int &)const;//幂运算
        int operator%(const int &)const;//取模
        bool operator>(const BigNum &)const;//大数与大数比较
        bool operator>(const int &)const;//大数与int比较
    
        void print();//输出大数
    };
    
    BigNum::BigNum(const int b){//将int转化为大数
        int c,d=b;
        len=0;
        memset(a,0,sizeof(a));
        while(d>MAXN){
            //c=d-(d/(MAXN+1))*(MAXN+1);
            c=d%(MAXN+1);//取出后四位
            d=d/(MAXN+1);//
            a[len++]=c;
        }
        a[len++]=d;
    }
    BigNum::BigNum(const char *s){//将字符串转化为大数
        int t,k,index,l,i,j;
        memset(a,0,sizeof(a));
        l=strlen(s);
        len=l/DLEN;
        if(l%DLEN)++len;
        index=0;
        for(i=l-1;i>=0;i-=DLEN){
            t=0;
            k=i-DLEN+1;
            if(k<0)k=0;
            for(j=k;j<=i;++j)
                t=t*10+s[j]-'0';
            a[index++]=t;
        }
    }
    BigNum::BigNum(const BigNum &T):len(T.len){//拷贝构造函数
        int i;
        memset(a,0,sizeof(a));
        for(i=0;i<len;++i)
            a[i]=T.a[i];
    }
    BigNum &BigNum::operator=(const BigNum &n){//重载复制运算符,大数之间赋值
        int i;
        len=n.len;
        memset(a,0,sizeof(a));
        for(i=0;i<len;++i)
            a[i]=n.a[i];
        return *this;
    }
    
    BigNum BigNum::operator+(const BigNum &T)const{//大数+大数
        BigNum t(*this);
        int i,big;//位数
        big=T.len>len?T.len:len;
        for(i=0;i<big;++i){
            t.a[i]+=T.a[i];
            if(t.a[i]>MAXN){
                ++t.a[i+1];
                t.a[i]-=MAXN+1;
            }
        }
        if(t.a[big]!=0)t.len=big+1;
        else t.len=big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum &T)const{//大数-大数
        int i,j,big;
        bool flag;
        BigNum t1,t2;//t1大的,t2小的
        if(*this>T){
            t1=*this;
            t2=T;
            flag=0;//前面的大
        }
        else{
            t1=T;
            t2=*this;
            flag=1;//前面的小
        }
        big=t1.len;
        for(i=0;i<big;++i){
            if(t1.a[i]<t2.a[i]){
                j=i+1;
                while(t1.a[j]==0)++j;
                --t1.a[j--];
                while(j>i)t1.a[j--]+=MAXN;
                t1.a[i]+=MAXN+1-t2.a[i];
            }
            else t1.a[i]-=t2.a[i];
        }
        while(t1.a[t1.len-1]==0&&t1.len>1){
            --t1.len;
            --big;
        }
        if(flag)t1.a[big-1]=-t1.a[big-1];//前面的小,结果为负
        return t1;
    }
    BigNum BigNum::operator*(const BigNum &T)const{//大数*大数
        BigNum ret;
        int i,j,up;
        int temp,temp1;
        for(i=0;i<len;++i){
            up=0;
            for(j=0;j<T.len;++j){
                temp=a[i]*T.a[j]+ret.a[i+j]+up;
                if(temp>MAXN){
                    //temp1=temp-temp/(MAXN+1)*(MAXN+1);
                    temp1=temp%(MAXN+1);
                    up=temp/(MAXN+1);
                    ret.a[i+j]=temp1;
                }
                else{
                    up=0;
                    ret.a[i+j]=temp;
                }
            }
            if(up!=0)ret.a[i+j]=up;
        }
        ret.len=i+j;
        while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
        return ret;
    }
    BigNum BigNum::operator/(const int &b)const{//大数/int
        BigNum ret;
        int i,down=0;
        for(i=len-1;i>=0;--i){
            ret.a[i]=(a[i]+down*(MAXN+1))/b;
            down=a[i]+down*(MAXN+1)-ret.a[i]*b;
        }
        ret.len=len;
        while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
        return ret;
    }
    
    BigNum BigNum::operator^(const int &n)const{//幂运算
        BigNum t,ret(1);
        int i;
        if(n<0)exit(-1);
        if(n==0)return 1;
        if(n==1)return *this;
        int m=n;
        while(m>1){
            t=*this;
            for(i=1;i<<1<=m;i<<=1){
                t=t*t;
            }
            m-=i;
            ret=ret*t;
            if(m==1)ret=ret*(*this);
        }
        return ret;
    }
    int BigNum::operator%(const int &b)const{//取模
        int i,d=0;
        for(i=len-1;i>=0;--i){
            d=((d*(MAXN+1))%b+a[i])%b;
        }
        return d;
    }
    bool BigNum::operator>(const BigNum &T)const{//大数与大数比较
        int ln;
        if(len>T.len)return true;
        else if(len==T.len){
            ln=len-1;
            while(a[ln]==T.a[ln]&&ln>=0)--ln;
            if(ln>=0&&a[ln]>T.a[ln])return true;
            else return false;
        }
        else return false;
    }
    bool BigNum::operator>(const int &t)const{//大数与int比较
        BigNum b(t);
        return *this>b;
    }
    
    void BigNum::print(){//输出大数
        int i;
        printf("%d",a[len-1]);
        for(i=len-2;i>=0;--i){
            printf("%.4d",a[i]);//%.4d代表4位,不够前面补0
        }
        printf("
    ");
    }
    
    int main(){
        char str1[]="2",str2[]="22222222222222222222222222222222222222222222";
        int c=2;
        //scanf("%s%s",str1,str2);
        BigNum a,b,t;
        a=BigNum(str1);
        b=BigNum(str2);
        printf("a=");a.print();
        printf("b=");b.print();
        printf("c=%d
    ",c);
        printf("
    ");
    
        t=a+b;
        printf("a+b=");t.print();
        t=a-b;
        printf("a-b=");t.print();
        t=a*b;
        printf("a*b=");t.print();
        t=a/c;
        printf("a/c=");t.print();
        printf("
    ");
    
        t=a^c;
        printf("a^c=");t.print();
        t=a%c;
        printf("a%%c=");t.print();
    
        a>b?printf("a>b
    "):printf("a<=b
    ");
        a>c?printf("a>c
    "):printf("a<=c
    ");
    
        return 0;
    }
    View Code

    2.char数组

    /*
    整数大数
    char数组实现
    */
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    
    #define MAXN 9
    #define DLEN 1
    
    class BigNum{
    private:
        char a[1024];
        int len;
    public:
        BigNum(){
            len=1;
            memset(a,0,sizeof(a));
        }
        BigNum(const int);
        BigNum(const char *);
        BigNum(const BigNum &);
        BigNum &operator=(const BigNum &);
    
        BigNum operator+(const BigNum &)const;
        BigNum operator-(const BigNum &)const;
        BigNum operator*(const BigNum &)const;
        BigNum operator/(const int &)const;
    
        BigNum operator^(const int &)const;
        int operator%(const int &)const;
        bool operator>(const BigNum &)const;
        bool operator>(const int &)const;
    
        void print();
    };
    
    BigNum::BigNum(const int b){
        memset(a,0,sizeof(a));
        len=0;
        int d=b;
        while(d>MAXN){
            a[len++]=d%10;
            d=d/10;
        }
        a[len++]=d;
    }
    BigNum::BigNum(const char *s){
        memset(a,0,sizeof(a));
        len=strlen(s);
        int i,k=0;
        for(i=len-1;i>=0;--i)
            a[k++]=s[i]-'0';
    }
    BigNum::BigNum(const BigNum &T){
        memset(a,0,sizeof(a));
        len=T.len;
        int i;
        for(i=0;i<len;++i)
            a[i]=T.a[i];
    }
    BigNum &BigNum::operator=(const BigNum &n){
        memset(a,0,sizeof(a));
        len=n.len;
        int i;
        for(i=0;i<len;++i)
            a[i]=n.a[i];
        return *this;
    }
    
    BigNum BigNum::operator+(const BigNum &T)const{
        BigNum t(*this);
        int i,big;
        big=T.len>len?T.len:len;
        for(i=0;i<big;++i){
            t.a[i]+=T.a[i];
            if(t.a[i]>MAXN){
                ++t.a[i+1];
                t.a[i]-=MAXN+1;
            }
        }
        if(t.a[big]!=0)t.len=big+1;
        else t.len=big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum &T)const{
        int i,j,big;
        bool flag;
        BigNum t1,t2;
        if(*this>T){
            t1=*this;
            t2=T;
            flag=0;
        }
        else{
            t1=T;
            t2=*this;
            flag=1;
        }
        big=t1.len;
        for(i=0;i<big;++i){
            if(t1.a[i]<t2.a[i]){
                j=i+1;
                while(t1.a[j]==0)++j;
                --t1.a[j--];
                while(j>i)t1.a[j--]+=MAXN;
                t1.a[i]+=MAXN+1-t2.a[i];
            }
            else t1.a[i]-=t2.a[i];
        }
        while(t1.a[t1.len-1]==0&&t1.len>1){
            --t1.len;
            --big;
        }
        if(flag)t1.a[big-1]=-t1.a[big-1];
        return t1;
    }
    BigNum BigNum::operator*(const BigNum &T)const{
        BigNum ret;
        int i,j,up;
        int temp,temp1;
        for(i=0;i<len;++i){
            up=0;
            for(j=0;j<T.len;++j){
                temp=a[i]*T.a[j]+ret.a[i+j]+up;
                if(temp>MAXN){
                    temp1=temp%(MAXN+1);
                    up=temp/(MAXN+1);
                    ret.a[i+j]=temp1;
                }
                else{
                    up=0;
                    ret.a[i+j]=temp;
                }
            }
            if(up!=0)ret.a[i+j]=up;
        }
        ret.len=i+j;
        while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
        return ret;
    }
    BigNum BigNum::operator/(const int &b)const{
        BigNum ret;
        int i,down=0;
        for(i=len-1;i>=0;--i){
            ret.a[i]=(a[i]+down*(MAXN+1))/b;
            down=a[i]+down*(MAXN+1)-ret.a[i]*b;
        }
        ret.len=len;
        while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
        return ret;
    }
    
    BigNum BigNum::operator^(const int &n)const{
        BigNum t,ret(1);
        int i;
        if(n<0)exit(-1);
        if(n==0)return 1;
        if(n==1)return *this;
        int m=n;
        while(m>1){
            t=*this;
            for(i=1;i<<1<=m;i<<=1){
                t=t*t;
            }
            m-=i;
            ret=ret*t;
            if(m==1)ret=ret*(*this);
        }
        return ret;
    }
    int BigNum::operator%(const int &b)const{
        int i,d=0;
        for(i=len-1;i>=0;--i){
            d=((d*(MAXN+1))%b+a[i])%b;
        }
        return d;
    }
    bool BigNum::operator>(const BigNum &T)const{
        int ln;
        if(len>T.len)return true;
        else if(len==T.len){
            ln=len-1;
            while(a[ln]==T.a[ln]&&ln>=0)--ln;
            if(ln>=0&&a[ln]>T.a[ln])return true;
            else return false;
        }
        else return false;
    }
    bool BigNum::operator>(const int &t)const{
        BigNum b(t);
        return *this>b;
    }
    
    void BigNum::print(){
        int i;
        for(i=len-1;i>=0;--i)
            printf("%d",a[i]);
        printf("
    ");
    }
    
    int main(){
        char str1[]="2",str2[]="22222222222222222222222222222222222222222222";
        int c=2;
        //scanf("%s%s",str1,str2);
        BigNum a,b,t;
        a=BigNum(str1);
        b=BigNum(str2);
        printf("a=");a.print();
        printf("b=");b.print();
        printf("c=%d
    ",c);
        printf("
    ");
    
        t=a+b;
        printf("a+b=");t.print();
        t=a-b;
        printf("a-b=");t.print();
        t=a*b;
        printf("a*b=");t.print();
        t=a/c;
        printf("a/c=");t.print();
        printf("
    ");
    
        t=a^c;
        printf("a^c=");t.print();
        t=a%c;
        printf("a%%c=");t.print();
    
        a>b?printf("a>b
    "):printf("a<=b
    ");
        a>c?printf("a>c
    "):printf("a<=c
    ");
        return 0;
    }
    View Code

    网上的一个原版:

    /*
    整数大数
    int数组实现
    */
    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<string.h>
    #include<iomanip>
    #include<algorithm>
    using namespace std;
    
    #define MAXN 9999//万进制
    #define MAXSIZE 10//用于cin输入时,大数长度为 MAXSIZE*4
    #define DLEN 4//4位
    
    class BigNum
    {
    private:
        int a[500];    //可以控制大数的位数
        int len;       //大数长度
    public:
        BigNum()
        {
            len = 1;    //构造函数
            memset(a,0,sizeof(a));
        }
        BigNum(const int);       //将一个int类型的变量转化为大数
        BigNum(const char*);     //将一个字符串类型的变量转化为大数
        BigNum(const BigNum &);  //拷贝构造函数
        BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算
    
        friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
        friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符
    
        BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
        BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
        BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
        BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算
    
        BigNum operator^(const int  &) const;    //大数的n次方运算
        int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
        bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
        bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较
    
        void print();       //输出大数
    };
    BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
    {
        int c,d = b;
        len = 0;
        memset(a,0,sizeof(a));
        while(d > MAXN)
        {
            c = d - (d / (MAXN + 1)) * (MAXN + 1);
            d = d / (MAXN + 1);
            a[len++] = c;
        }
        a[len++] = d;
    }
    BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
    {
        int t,k,index,l,i;
        memset(a,0,sizeof(a));
        l=strlen(s);
        len=l/DLEN;
        if(l%DLEN)
            len++;
        index=0;
        for(i=l-1; i>=0; i-=DLEN)
        {
            t=0;
            k=i-DLEN+1;
            if(k<0)
                k=0;
            for(int j=k; j<=i; j++)
                t=t*10+s[j]-'0';
            a[index++]=t;
        }
    }
    BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
    {
        int i;
        memset(a,0,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = T.a[i];
    }
    BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
    {
        int i;
        len = n.len;
        memset(a,0,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = n.a[i];
        return *this;
    }
    istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符
    {
        char ch[MAXSIZE*4];
        int i = -1;
        in>>ch;
        int l=strlen(ch);
        int count=0,sum=0;
        for(i=l-1; i>=0;)
        {
            sum = 0;
            int t=1;
            for(int j=0; j<4&&i>=0; j++,i--,t*=10)
            {
                sum+=(ch[i]-'0')*t;
            }
            b.a[count]=sum;
            count++;
        }
        b.len =count++;
        return in;
    
    }
    ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
    {
        int i;
        cout << b.a[b.len - 1];
        for(i = b.len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << b.a[i];
        }
        return out;
    }
    
    BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
    {
        BigNum t(*this);
        int i,big;      //位数
        big = T.len > len ? T.len : len;
        for(i = 0 ; i < big ; i++)
        {
            t.a[i] +=T.a[i];
            if(t.a[i] > MAXN)
            {
                t.a[i + 1]++;
                t.a[i] -=MAXN+1;
            }
        }
        if(t.a[big] != 0)
            t.len = big + 1;
        else
            t.len = big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
    {
        int i,j,big;
        bool flag;
        BigNum t1,t2;
        if(*this>T)
        {
            t1=*this;
            t2=T;
            flag=0;
        }
        else
        {
            t1=T;
            t2=*this;
            flag=1;
        }
        big=t1.len;
        for(i = 0 ; i < big ; i++)
        {
            if(t1.a[i] < t2.a[i])
            {
                j = i + 1;
                while(t1.a[j] == 0)
                    j++;
                t1.a[j--]--;
                while(j > i)
                    t1.a[j--] += MAXN;
                t1.a[i] += MAXN + 1 - t2.a[i];
            }
            else
                t1.a[i] -= t2.a[i];
        }
        t1.len = big;
        while(t1.a[t1.len - 1] == 0 && t1.len > 1)
        {
            t1.len--;
            big--;
        }
        if(flag)
            t1.a[big-1]=0-t1.a[big-1];
        return t1;
    }
    
    BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
    {
        BigNum ret;
        int i,j,up;
        int temp,temp1;
        for(i = 0 ; i < len ; i++)
        {
            up = 0;
            for(j = 0 ; j < T.len ; j++)
            {
                temp = a[i] * T.a[j] + ret.a[i + j] + up;
                if(temp > MAXN)
                {
                    temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
                    up = temp / (MAXN + 1);
                    ret.a[i + j] = temp1;
                }
                else
                {
                    up = 0;
                    ret.a[i + j] = temp;
                }
            }
            if(up != 0)
                ret.a[i + j] = up;
        }
        ret.len = i + j;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
    {
        BigNum ret;
        int i,down = 0;
        for(i = len - 1 ; i >= 0 ; i--)
        {
            ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
            down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
        }
        ret.len = len;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
    {
        int i,d=0;
        for (i = len-1; i>=0; i--)
        {
            d = ((d * (MAXN+1))% b + a[i])% b;
        }
        return d;
    }
    BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
    {
        BigNum t,ret(1);
        int i;
        if(n<0)
            exit(-1);
        if(n==0)
            return 1;
        if(n==1)
            return *this;
        int m=n;
        while(m>1)
        {
            t=*this;
            for( i=1; i<<1<=m; i<<=1)
            {
                t=t*t;
            }
            m-=i;
            ret=ret*t;
            if(m==1)
                ret=ret*(*this);
        }
        return ret;
    }
    bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
    {
        int ln;
        if(len > T.len)
            return true;
        else if(len == T.len)
        {
            ln = len - 1;
            while(a[ln] == T.a[ln] && ln >= 0)
                ln--;
            if(ln >= 0 && a[ln] > T.a[ln])
                return true;
            else
                return false;
        }
        else
            return false;
    }
    bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
    {
        BigNum b(t);
        return *this>b;
    }
    
    void BigNum::print()    //输出大数
    {
        int i;
        cout << a[len - 1];
        for(i = len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << a[i];
        }
        cout << endl;
    }
    int main()
    {
        char str[100];
        BigNum a;
        scanf("%s",str);
        a=BigNum(str);
        a.print();
        return 0;
    }
    View Code

    小数:

    这里只写了个小数加法,代码臃肿,先将就着用。。

    /*
    小数大数,加法
    char数组实现
    */
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    
    void plu(char *a,char *b){//注意存储方式:整数倒着存,小数正着存,看代码需注意
        int i,j,k,lena,lenb,lena1,lena2,lenb1,lenb2,lenc1,lenc2;//len分别对应相应数组的长度
        char a1[1024],a2[1024],b1[1024],b2[1024],c1[1024],c2[1024];//a1、a2为第一个数的整数部分、小数部分
        lena=strlen(a);//b1、b2为第二个数;c1、c2为结果
        lenb=strlen(b);
        //取出第1个数的整数部分、小数部分
        for(i=0;i<lena;++i)
            if(a[i]=='.')
                break;
        lena1=i;
        lena2=lena-i-1;
        for(j=i-1,k=0;j>=0;--j)
            a1[k++]=a[j];
        for(j=i+1,k=0;j<lena;++j)
            a2[k++]=a[j];
    
        //取出第2个数的整数部分、小数部分
        for(i=0;i<lenb;++i)
            if(b[i]=='.')
                break;
        lenb1=i;
        lenb2=lenb-i-1;
        for(j=i-1,k=0;j>=0;--j)
            b1[k++]=b[j];
        for(j=i+1,k=0;j<lenb;++j)
            b2[k++]=b[j];
    
        //开始计算
        int up=0;//进位
        //计算小数部分
        if(lena2>lenb2){
            lenc2=lena2;
            for(i=lena2-1;i>=lenb2;--i)
                c2[i]=a2[i];
            for(;i>=0;--i){
                c2[i]=a2[i]+b2[i]-'0'+up;
                if(c2[i]>'9'){
                    up=1;
                    c2[i]-=10;
                }
                else up=0;
            }
        }
        else{
            lenc2=lenb2;
            for(i=lenb2-1;i>=lena2;--i)
                c2[i]=b2[i];
            for(;i>=0;--i){
                c2[i]=a2[i]+b2[i]-'0'+up;
                if(c2[i]>'9'){
                    up=1;
                    c2[i]-=10;
                }
                else up=0;
            }
        }
        while(c2[lenc2-1]=='0'&&lenc2>=1)--lenc2;//去除后面多余的0
        //计算整数部分
        if(lena1>lenb1){
            lenc1=lena1;
            for(i=0;i<lenb1;++i){
                c1[i]=a1[i]+b1[i]-'0'+up;
                if(c1[i]>'9'){
                    up=1;
                    c1[i]-=10;
                }
                else up=0;
            }
            for(;i<lena1;++i){
                c1[i]=a1[i]+up;
                if(c1[i]>'9'){
                    up=1;
                    c1[i]-=10;
                }
                else up=0;
            }
        }
        else{
            lenc1=lenb1;
            for(i=0;i<lena1;++i){
                c1[i]=a1[i]+b1[i]-'0'+up;
                if(c1[i]>'9'){
                    up=1;
                    c1[i]-=10;
                }
                else up=0;
            }
            for(;i<lenb1;++i){
                c1[i]=b1[i]+up;
                if(c1[i]>'9'){
                    up=1;
                    c1[i]-=10;
                }
                else up=0;
            }
        }
    
        if(up==1)printf("1");//最后有进位
    
        for(i=lenc1-1;i>=0;--i)
            printf("%c",c1[i]);
    
        if(lenc2>0){
            printf(".");
            for(i=0;i<lenc2;++i)
                printf("%c",c2[i]);
        }
        printf("
    ");
    }
    
    int main(){
        char a[1024],b[1024];
        while(~scanf("%s%s",a,b))
            plu(a,b);
        return 0;
    }
    View Code
  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/gongpixin/p/5360902.html
Copyright © 2011-2022 走看看