大数加法顺序表及链式表的实现

数据结构作业一:

大数加法的顺序表(数组)实现:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5000;//大整数最大精度
class big_int       //大整数类
{
private:
    char digit[maxn];//储存数位;
public:
    big_int(){};                //构造一:
    big_int(big_int &a);        //构造函数
    ~big_int(){};               //析构
    big_int operator+(big_int &a);
    //big_int operator=(big_int &a);
    void get(char a[]);
    void show();
};
void big_int::get(char a[])
{
    int n=strlen(a);
    for(int i=0;i<n;i++)
    {
        digit[i]=a[i];
    }
    return;
}
void big_int::show()
{
    printf("%s",digit);
    return ;
}
big_int::big_int(big_int &a)
{
    int n=strlen(a.digit);
    for(int i=0;i<n;i++)
    digit[i]=a.digit[i];
}
big_int big_int::operator+(big_int &a)
{
    big_int now;
    int n=strlen(this->digit);
    int m=strlen(a.digit);
    bool fa=false;
    if(n>m){
    for(int i=0;i<n-m;i++)
    {
        now.digit[i]=this->digit[i];
    }
    for(int i=0;i<m;i++)
    {
        now.digit[n-m+i]=this->digit[n-m+i]+a.digit[i]-'0';
    }
    }
    else
    {
    for(int i=0;i<m-n;i++)
    {
        now.digit[i]=a.digit[i];
    }
    for(int i=0;i<n;i++)
    {
        now.digit[m-n+i]=this->digit[i]+a.digit[m-n+i]-'0';
    }
    }
    int intnow=0;
    for(int i=max(n,m)-1;i>=0;i--)
    {
        now.digit[i]+=intnow;
        if(now.digit[i]-'9'>0)
        {
            intnow=1;
            now.digit[i]-=10;
        }
        else
            intnow=0;
    }
    if(intnow==1)
    {
        for(int i=max(n,m);i>0;i--)
            now.digit[i]=now.digit[i-1];
        now.digit[0]=1;
    }
    return now;

}
/*big_int big_int::operator=(big_int &a)
{
   int n=strlen(a.digit);
   for(int i=0;i<n;i++)
   {
       digit[i]=a.digit[i];
   }
}*/

int main()
{
    char ch[maxn];
    printf("请输入大数a:");
    scanf("%s",ch);
    big_int a,b;
    a.get(ch);
    printf("\n请输入大数b:");
    scanf("%s",ch);
    b.get(ch);
    big_int c;
    c=
    a+b;
    printf("\n");
    a.show();
    printf("\n+\n");
    b.show();
    printf("\n=\n");
    c.show();

    return 0;
}

大数加法的链表实现;

#include<bits/stdc++.h>
using namespace std;
const int maxn=0x3fff;
class bigint
{
private:
    char  digit[maxn];              //储存数位;
public:
    bigint(){};                     //构造一:
    bigint(bigint &a);              //复制构造函数
    bigint operator+(bigint &a);    //加法操作
    ~bigint(){};
    void get(char a[]);             //赋值函数
    void show();                    //输出函数
    void bigintscan();              //输入函数
};
bigint::bigint(bigint &a){
    int n=strlen(a.digit);
    for(int i=0;i<n;i++)
    this->digit[i]=a.digit[i];
    digit[n]='\0';
}
bigint bigint::operator+(bigint &a){
    bigint d;
    int n=strlen(a.digit);
    int m=strlen(this->digit);
    //分情况来处理,思路比较清晰;
    if(n>m){
        //逐步相加部分;
        for(int i=0;i<m;i++){
            d.digit[i]=a.digit[i]+this->digit[i]-'0';
        }
        for(int i=m;i<n;i++){
            d.digit[i]=a.digit[i];
        }
        //进位单独操作;
        int jinwei=0;
        for(int i=0;i<n;i++){
            d.digit[i]+=jinwei;
            jinwei=(int)(d.digit[i]>'9');
            if(jinwei){
                d.digit[i]-=10;
            }
        }
        if(jinwei){d.digit[n]='1';d.digit[n+1]='\0';}
        else d.digit[n]='\0';
        }

    else {
        //逐步相加部分:
        for(int i=0;i<n;i++){
            d.digit[i]=a.digit[i]+this->digit[i]-'0';
        }
        //多的部分直接传递过来就好;
        for(int i=n;i<m;i++){
            d.digit[i]=this->digit[i];
        }
        //处理进位操作;
        int jinwei=0;
        for(int i=0;i<m;i++){
            d.digit[i]+=jinwei;
            jinwei=(int)(d.digit[i]>'9');
            if(jinwei){
                d.digit[i]-=10;
            }
        }
        if(jinwei){d.digit[m]='1';d.digit[m+1]='\0';}
        else d.digit[m]='\0';
    }
    return d;
}
void bigint::get(char a[]){
    int n=strlen(a);
    for(int i=0;i<n;i++)
    {
        digit[i]=a[n-i-1];
    }
    digit[n]='\0';
    return;
}
void bigint::show(){
    int n=strlen(digit);
    for(int i=n-1;i>=0;i--){
        cout<<digit[i];
    }
    return ;
}
void bigint::bigintscan(){
    string a;
    cin>>a;
    char b[maxn];
    int n=a.length();
    for(int i=0;i<n;i++){
        b[i]=a[i];
    }b[n]='\0';
    get(b);
}
int main()
{
    bigint a,b;
    cout<<"请输入一个数:";
    a.bigintscan();
    cout<<"请输入第二个数:";
    b.bigintscan();
    bigint c;
    c=a+b;
    cout<<"和为:";
    c.show();
    return 0;
}

总的来说大数加法只需要考虑数的储存,逐位相加,进位,输出即可,又因为相加需要从个位操作,输出是从高位输出可能需要一些考虑;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值