大整数

模拟竖式运算
注意好字符处理、颠倒对齐、借位加位、排除无效零等细节即可


加法:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char chA[510],chB[510];
    cin>>chA>>chB;
    int len_chA=strlen(chA);
    int len_chB=strlen(chB);
    int inA[510]={0},inB[510]={0},inC[510]={0};
    for(int i=0;i<len_chA;++i)
    {
        inA[len_chA-1-i]=chA[i]-'0';
    }
    for(int i=0;i<len_chB;++i)
    {
        inB[len_chB-1-i]=chB[i]-'0'; 
    }
    bool jinwei=false;
    for(int i=0;i<len_chA||i<len_chB;++i)
    {
        inC[i]+=inA[i]+inB[i];
        int tempi=i;
        while(inC[tempi]>=10)
        {
            inC[tempi]-=10;
            ++inC[tempi+1];
            ++tempi;
            if(tempi>=len_chA&&tempi>=len_chB)
            {
                jinwei=true;
            }
        }
    }
    int len_C=max(len_chA,len_chB);
    if(jinwei)  ++len_C;

    for(int i=len_C-1;i>=0;--i)
    {
        cout<<inC[i];
    }
    return 0;
 } 

减法:
(注意大整数比较大小)

#include<iostream>
#include<cstring>
using namespace std;
int which_bigger(int left[510],int right[510],int leftlen,int rightlen)//-1为左边大,1为右边大,0表示一样大
{
    if(leftlen>rightlen)    return -1;
    else if(rightlen>leftlen)   return 1;
    else
    {
        for(int i=leftlen-1; i>=0; --i)
        {
            if(left[i]>right[i])    return -1;
            else if(right[i]>left[i])   return 1;
        }
    }
    return 0;

}
void Minus(int x[510],int y[510],int lenx,int leny,int z[510])
{
    for(int i=0;i<lenx;++i)
    {
        else
        if(x[i]-y[i]>=0)    z[i]=x[i]-y[i];
        {
            z[i]=x[i]+10-y[i];
            x[i+1]--;
            int tempi=i+1;
            while(x[tempi]<0)
            {
                x[tempi]+=10;
                x[tempi+1]-=1;
                tempi+=1;
            } 
        }
    }
} 
int main()
{
    char chA[510],chB[510];
    cin>>chA>>chB;
    int len_A=strlen(chA);
    int len_B=strlen(chB);

    int inA[510]= {0},inB[510]= {0},inC[510]= {0};
    for(int i=0; i<len_A; ++i)
    {
        inA[i]=chA[len_A-1-i]-'0';
    }
    for(int i=0; i<len_B; ++i)
    {
        inB[i]=chB[len_B-1-i]-'0';
    }
    int A_B_bigger=which_bigger(inA,inB,len_A,len_B);
    if(A_B_bigger==0)
    {
        cout<<"0";
    }
    else
    {
        int lenC=0;
        if(A_B_bigger==-1)
        {
            Minus(inA,inB,len_A,len_B,inC);
            lenC=len_A-1;
        }
        else
        {
            Minus(inB,inA,len_B,len_A,inC);
            cout<<"-";
            lenC=len_B-1;
        } 
        while(inC[lenC]==0)
        {
            lenC--;
        }
        for(int i=lenC;i>=0;--i)    cout<<inC[i];

    }
    return 0;

}

乘法:
(注意这里的进位不一定为进1了)

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char chA[510],chB[510];
    cin>>chA>>chB;
    int lenA=strlen(chA);
    int lenB=strlen(chB);

    int inA[510]={0},inB[510]={0},inC[1024]={0};
    for(int i=0;i<lenA;++i)
    {
        inA[i]=chA[lenA-1-i]-'0';
    }
    for(int i=0;i<lenB;++i)
    {
        inB[i]=chB[lenB-1-i]-'0';
    }

    for(int i=0;i<lenB;++i)
    {
        for(int j=0;j<lenA;++j)
        {
             inC[i+j]+=inA[j]*inB[i];
        }
        int tempi=i;
        while(tempi<lenA+lenB)
        {
            if(inC[tempi]>=10)
            {
                inC[tempi+1]+=inC[tempi]/10;
                inC[tempi]=inC[tempi]%10;
                tempi+=1;
            }
            else
            {
                tempi+=1;
            }
        }
    }
    int lenC=lenA+lenB-1;
    while(inC[lenC]==0)
    {
        lenC--;
    }
    for(int i=lenC;i>=0;--i)
    {
        cout<<inC[i];
    }
    return 0;
}

That’all.
Thank you.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值