大整数,超过c++ longlong范围的一些数字,可以使用Java自带的大数类进行运算,或者使用字符串进行模拟加减法,这里说一下使用c++字符串进行模拟加减法。


 加法

   对于加法,首先使用字符串将两个大数读进来,这里注意一下,由于最高位是第一个读进来的数字,所以最高位是首位。如果使用字符数组的话,建议逆置一下。链表的话就没有必要了。然后我们就需要将两个大数进行逐位相加,本人不建议在逐位相加时处理进位,最后处理进位,相加完之后,在从末尾开始处理进位,对于大于10的数字,想前一位进一。(这里简单用数组演示一下):

图片说明

   然后需要从最低未开始向高位处理进位,按照逢十进一的原则处理进位即可,这里注意下,有可能将最高位处理为两位数,这时又需要进位了,如果是仅仅需要输出大整数计算结果,那么最高位不进位也没有关系,因为进位只是把最高位的两位数拆分成了两个数字。如果后续还有其他运算,那么建议进位。


 减法

   对于减法来说,读入过程和加法相同,但需要注意的时,减法需要长度长的数字去间长度短的数字,否则会造成错误(自己最初被这个问题坑了半天),然后就需要逐位相减,最后统一处理借位即可,和加法大同小异,这里不再论述。


   下面看一下代码(链表版)(由于课本的要求 ,需要按照每四位一个逗号进行输入如输出):

#include<bits/stdc++.h>
using namespace std;
struct node{
    int date;
    node *next,*pre;
    int flag;
}*head1,*head2;

void add(int flag){
    node *l1=head1,*l2=head2,*p,*q;
    while(l2!=NULL){                                        //各位相加
        l1->date+=l2->date;
        l1=l1->next;
        l2=l2->next;
    }

    l1=head1;
    while(l1->next!=NULL){                                  //处理进位
        if(l1->date>=10){
            l1->next->date+=l1->date/10;
            l1->date%=10;
        }
        l1=l1->next;
    }

    if(l1->date>=10){                                        //最高位进位分析
        p=(node *)malloc(sizeof(node));
        p->date=l1->date/10;
        l1->date%=10;
        l1->next=p;
        p->next=NULL;
    }

    int count=0;                                            //逗号添加
    p=head1;
    while(p){
        if(count%4==0&&count>=4) p->flag=1;
        p=p->next;
        count++;
    }

    q=head1;                                                //链表逆置
    p=head1->next;
    while(p){
        head1->next=p->next;
        p->next=q;
        q=p;
        p=head1->next;
    }
    head1->next=NULL;

    if(flag==-1) cout<<"-";                                 //正负判断

    while(q){                                               //输出
        cout<<q->date;
        if(q->flag==1) cout<<',';
        q=q->next;
    }
}

void substr(){
    node *l1=head1,*l2=head2,*p,*q,*newhead;

    while(l2!=NULL){                                        //逐位相减
        l1->date-=l2->date;
        l1=l1->next;
        l2=l2->next;
    }

    l1=head1;                                               //处理借位
    while(l1->next!=NULL){
        if(l1->date<0){
            l1->date+=10;
            l1->next->date-=1;
        }
        l1=l1->next;
    }

    int count=0;                                            //逗号添加
    p=head1;
    while(p){
        if(count%4==0&&count>0) p->flag=1;
        count++;
        p=p->next;
    }

    q=head1;                                                //链表逆置
    p=head1->next;
    while(p){
        head1->next=p->next;
        p->next=q;
        q=p;
        p=head1->next;
    }
    head1->next=NULL;

    int book=0;
    while(q){                                               //输出
        if(q->date!=0||book){
            book=1;
            cout<<q->date;
            if(q->flag==1) cout<<",";
        }
        q=q->next;
    }
}

int main(){

    cout<<"please input two integer:"<<endl;

    string str1,str2;

    cin>>str1>>str2;

    if((str1[0]=='-'&&str2[0]=='-')||(str1[0]>='0'&&str1[0]<='9'&&str2[0]>='0'&&str2[0]<='9')){     //符号相同
        int flag=1;
        if(str1[0]=='-') flag=-1;
        node *p,*pre;
        int len1=str1.length();
        int len2=str2.length();

        for(int q=len1-1;q>(flag==-1?0:-1);q--){
            if(str1[q]==',') continue;
            p=(node *)malloc(sizeof(node));
            p->flag=0;
            p->date=str1[q]-'0';
            if(q==len1-1) { len1>len2?head1=p:head2=p; }
            else { pre->next=p; }
            pre=p;
        }
        p->next=NULL;

        for(int q=len2-1;q>(flag==-1?0:-1);q--){
            if(str2[q]==',') continue;
            p=(node *)malloc(sizeof(node));
            p->flag=0;
            p->date=str2[q]-'0';
            if(q==len2-1) { len2>=len1?head1=p:head2=p; }
            else { pre->next=p; }
            pre=p;
        }
        p->next=NULL;

        add(flag);
    }

    else{                                                                                           //符号不同
        node *p,*pre,*q;
        int len1=str1.length();
        int len2=str2.length();
        int u=0;
        if(str1[0]=='-'){
            for(int q=len1-1;q>0;q--){
                if(str1[q]==',') continue;
                p=(node *)malloc(sizeof(node));
                if(q==len1-1) { head1=p; }
                else { pre->next=p; }
                p->flag=0;
                p->date=str1[q]-'0';
                pre=p;
            }
            p->next=0;

            for(int q=len2-1;q>=0;q--){
                if(str2[q]==',') continue;
                p=(node *)malloc(sizeof(node));
                if(q==len2-1) { head2=p; }
                else { pre->next=p; }
                p->flag=0;
                p->date=str2[q]-'0';
                pre=p;
            }
            p->next=0;

            if(strcmp(&str1[1],&str2[0])==0) cout<<"0";
            else{
                if(len1-1>len2){
                    cout<<"-";
                    substr();
                }
                else if(len1-1==len2){
                    if(strcmp(&str1[1],&str2[0])>0){
                        cout<<"-";
                    }
                    substr();
                }
                else {
                    p=head1;head1=head2;head2=p;
                    substr();
                }
            }
        }

        else{
            for(int q=len1-1;q>=0;q--){
                if(str1[q]==',') continue;
                p=(node *)malloc(sizeof(node));
                if(q==len1-1) { head1=p; }
                else { pre->next=p; }
                p->flag=0;
                p->date=str1[q]-'0';
                pre=p;
            }
            p->next=0;
            for(int q=len2-1;q>0;q--){
                if(str2[q]==',') continue;
                p=(node *)malloc(sizeof(node));
                if(q==len2-1) { head2=p; }
                else { pre->next=p; }
                p->flag=0;
                p->date=str2[q]-'0';
                pre=p;
            }
            p->next=0;
            if(strcmp(&str1[0],&str2[1])==0) cout<<"0";
            else{
                if(len2-1>len1){
                    p=head1;head1=head2;head2=p;
                    cout<<"-";
                    substr();
                }
                else if(len2-1==len1){
                    if(strcmp(&str1[0],&str2[1])>0){
                        substr();
                    }
                    else {
                        p=head1;head1=head2;head2=p;
                        cout<<"-";
                        substr();
                    }
                }
                else {
                    substr();
                }
            }
        }
    }
    return 0;
}