高精度加法减法乘法模板 (附题目链接)

一、高精度加法

nefu594 又是比大小

#include <bits/stdc++.h>

using namespace std;


int main()
{
    string a,b,c;
    int i;
    while(cin>>a>>b>>c)
    {
        
        int xa[1000]={},xb[1000]={},xc[1000]={};
        
        //转为数字数组
        for(i=0;i<a.length();i++)          
            xa[i]=a[a.length()-i-1]-'0';
        for(i=0;i<b.length();i++)
            xb[i]=b[b.length()-i-1]-'0';
        for(i=0;i<c.length();i++)
            xc[i]=c[c.length()-i-1]-'0';
            
        //高精度加法
        int cnt=max(a.length(),b.length());
        for(i=0;i<cnt;i++)                 
        {
            int t=xa[i]+xb[i];
            xa[i+1]+=t/10;
            xa[i]=t%10;
        }
        cnt=(cnt>c.length())?cnt:c.length();
        
        //高精度比较
        bool check=true,same=true;
        for(i=cnt;i>=0;i--)                 
        {
            if(xc[i]!=xa[i])same=false;
            if(xa[i]>xc[i])break;
            if(xa[i]<xc[i]){check=false;break;}
        }
        if(same)cout<<"NO"<<endl;
        else check?cout<<"YES"<<endl:cout<<"NO"<<endl;

    }
    return 0;
}

二、高精度减法

P2142 高精度减法

这个题有两个坑:

1.去除前导0

关键代码 while(!xa[i]&&i)i--;
如果没有,55-55就会等于00

2.小数减大数得负数的情况

用到公式:(a-b)= -(b-a)
解决思路:特判
特判当字符串1所表示的数小于字符串2所表示的数
关键代码if((a<b&&a.size()==b.size())||a.size()<b.size())
这里的字符串比较a<b需注意,规则大概如下:

从最高位比起,ASCIIASCII码更大的字符串更大。如果相等,比次高位,以此向下类推。

例如:9<89,因为9>8
12300>123,前三位相等,但是前面的字符串位数多

#include <bits/stdc++.h>

using namespace std;
bool pd;
string a,b;
int main()
{
    cin>>a>>b;
    if((a<b&&a.size()==b.size())||a.size()<b.size())
    {
        swap(a,b);
        pd=true;
    }
    int i;
    int xa[10500]={0},xb[10500]={0};
    for(i=0;i<a.length();i++)xa[i]=a[a.length()-i-1]-'0';
    for(i=0;i<b.length();i++)xb[i]=b[b.length()-i-1]-'0';
    int t;
    for( i=0;i<max(a.length(),b.length());i++)
    {
        t=xa[i]-xb[i];
        if(t<0){xa[i]=t+10;xa[i+1]--;}
        else xa[i]=t;
    }
    while(!xa[i]&&i)i--;//很重要,去掉前导0
    if(pd==true)cout<<"-";
    for(;i>=0;i--)cout<<xa[i];
    return 0;
}

三、高精度乘法

关键代码:

for(i=0;i<a.length();i++)
        for(j=0;j<b.length();j++)
        {
            c[i+j]+=xa[i]*xb[j];
        }

完整代码

#include <bits/stdc++.h>

using namespace std;
bool pd;
string a,b;
int xa[10005],xb[10005],c[10005];
int main()
{
    cin>>a>>b;
    int i,j;
    for(i=0;i<a.length();i++)xa[i]=a[a.length()-i-1]-'0';
    for(i=0;i<b.length();i++)xb[i]=b[b.length()-i-1]-'0';
    for(i=0;i<a.length();i++)
        for(j=0;j<b.length();j++)
        {
            c[i+j]+=xa[i]*xb[j];//+=容易丢
        }
    for(i=0;i<a.length()+b.length();i++)
    {
        if(c[i]>=10)
        {
            c[i+1]+=c[i]/10;
            c[i]=c[i]%10;
        }
    }
    while(!c[i]&&i)i--;
    for(;i>=0;i--)cout<<c[i];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhoucheng_123/article/details/104167390
今日推荐