您的位置:首页 > 编程语言 > C语言/C++

c++实现大数的加减乘运算(数组存放)

2017-11-01 18:37 519 查看
应用中需要解决大数运算问题,请设计无符号大数类,能支持+,-,*,比较运算和输出,假定本题大数在200位以内,输入数据均合法。

代码:

#include <iostream>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

class daShu{

private:

    int shu[200];

    int lens;

public:

    daShu(){

        lens=0;

        for(int i=0;i<200;i++)shu[i]=0;

    }

    void show()const{/*展示大数*/

        for(int i=0;i<lens;i++){

            cout<<shu[i];

        }

        cout<<endl;

    }

    int getsize(){return lens;}

    void intsert(int i,int e);

    daShu& operator=(const daShu &a);

    friend daShu operator+(const daShu &a,const daShu &b);/*重载运算符*/

    friend daShu operator-(const daShu &a,const daShu &b);

    friend daShu operator*(const daShu &a,const daShu &b);

};

void daShu::intsert(int i,int e){

    shu[i] = e;

    lens++;

}

daShu& daShu::operator=(const daShu &a){

    if(this!=&a){

        for(int i=0;i<lens;i++)shu[i]=0;

        for(int i=0;i<a.lens;i++)shu[i]=a.shu[i];

        lens=a.lens;

    }

    return *this;

}

daShu operator+(const daShu &a,const daShu &b){

    daShu temp;

    int x=0,y=0;/*记录十位,个位*/

    int add=0;/*记录临时和*/

    if(&b!=&a){

        int i=0,j=0;

        for(i=a.lens-1,j=b.lens-1;j>=0;i--,j--){

            add = a.shu[i]+b.shu[j]+y;

            x=add%10;//个位

            temp.shu[i]=x;

            add=add/10;

            y=add%10;//十位

        }

        while(i>=0){

            add = a.shu[i]+y;

            x=add%10;

            temp.shu[i]=x;

            //cout<<temp.shu[i];

            add=add/10;

            y=add%10;

            i--;

        }

        temp.lens=a.lens;

        if(y!=0){

            for(int i=temp.lens;i>0;i--)temp.shu[i]=temp.shu[i-1];

            temp.shu[0]=y;

            temp.lens+=1;

        }

    }

    return temp;

}

daShu operator-(const daShu &a,const daShu &b){

    daShu temp;

    if(&a!=&b){

        int i=0,j=0,k=0;

        for(i=0;i<a.lens;i++)temp.shu[i] = a.shu[i];

        for(i=a.lens-1,j=b.lens-1;j>=0;j--,i--){

            if(temp.shu[i]<b.shu[j]){

                temp.shu[i] = temp.shu[i]+10-b.shu[j];

                for(k=1;temp.shu[i-k]==0;k++){

                    temp.shu[i-k]=9;

     
4000
          }

                temp.shu[i-k]--;

            }else{

                temp.shu[i] = temp.shu[i]-b.shu[j];

            }

        }

        temp.lens = a.lens;

        if(temp.shu[0]==0){

            for(int m=0;m<temp.lens;m++)temp.shu[m]=temp.shu[m+1];

            temp.lens--;

        }

    }

    return temp;

}

daShu operator*(const daShu &a,const daShu &b){

    daShu temp;

    temp.lens=a.lens+b.lens;

    if(&a!=&b){

        int i=0,j=0,k=temp.lens-1;//k控制累加移动

        for(j=b.lens-1;j>=0;j--,k--){

            int m=k;

            int x=0,y=0;/*记录十位,个位*/

            int add=0;/*记录临时积*/

            for(i=a.lens-1;i>=0;i--,m--){//m控制移动

                add = b.shu[j]*a.shu[i]+temp.shu[m]+y;

                x=add%10;//个位

                temp.shu[m]=x;

                add=add/10;

                y=add%10;//十位

            }

            if(y!=0)temp.shu[m]=y;

        }

        while(temp.shu[0]==0){

            for(i=0;i<temp.lens;i++)temp.shu[i]=temp.shu[i+1];

            temp.lens--;

        }

    }

    return temp;

}

int main()

{

    daShu a,b,c,d,e;

    char x[200],y[200];

    cin.getline(x,200);

    cin.getline(y,200);

    for(size_t i=0;i<strlen(x);i++){

        char temp[2];

        temp[0] = x[i];

        temp[1] = '\0';

        a.intsert(i,atoi(temp));

    }

    for(size_t i=0;i<strlen(y);i++){

        char temp[2];

        temp[0] = y[i];

        temp[1] = '\0';

        b.intsert(i,atoi(temp));

    }

    c=a+b;

    d=a-b;

    e=a*b;

    c.show();

    d.show();

    e.show();

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: