• 高精度计算


    高精度加法

    #include<bits/stdc++.h>
    using namespace std;
    int x[1000005];
    int main()
    {
        string a,b;
        cin>>a>>b;
        if(a.size()<b.size())
            swap(a,b);
        for(int i=1; i<=a.size(); i++)
            x[i]=a[a.size()-i]-'0';
        for(int i=1; i<=b.size(); i++)
            x[i]+=b[b.size()-i]-'0';
        for(int i=1; i<=a.size(); i++)
        {
            if(x[i]>=10)
            {
                x[i]-=10;
                x[i+1]++;
            }
        }
        int len=a.size();
        if(x[len+1]>0)
            len++;
        for(int i=len; i>=1; i--)
            printf("%d", x[i]);
    }

     做法:得到两个数字串a,b以后,使a串长度默认比b大,否则交换,然后用x数组倒着装a,b两个数字串,然后相加,大于10的进一位,然后特判有没有长度+1,最后在将x数组倒着输出即可。

    高精度减法

    #include<bits/stdc++.h>
    using namespace std;
    int x[10005];
    int main()
    {
        string a,b;
        cin>>a>>b;
        int flag=0;
        if(a.size()<b.size())
        {
            swap(a,b);
            flag=1;
        }
        if(a.size()==b.size())
        {
            for(int i=0; i<a.size(); i++)
            {
                if(a[i]<b[i])
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
                swap(a,b);
        }
        for(int i=1; i<=a.size(); i++)
            x[i]=a[a.size()-i]-'0';
        for(int i=1; i<=b.size(); i++)
            x[i]-=b[b.size()-i]-'0';
        for(int i=1; i<=a.size(); i++)
        {
            if(x[i]<0)
            {
                x[i]+=10;
                x[i+1]--;
            }
        }
        int len=a.size();
        while(x[len]==0)
        {
            len--;
            if(len==0)
            {
                printf("0");
                return 0;
            }
        }
        if(flag==1)
            printf("-");
        for(int i=len; i>=1; i--)
            printf("%d", x[i]);
        return 0;
    }

    做法:先判断一下被减数和减数的大小关系,如果被减数更小的话用flag记录一下输出时加负号,同时在交换一下a,b,使默认a比b大,然后用x数组倒着装a,然后再倒着减b数组,

    然后判断x数组有没有负数,有的话+10,后面一位-1,最后特判一下x数组长度,末尾0要去掉,然后倒着输出即可。

    高精度乘法

    #include<bits/stdc++.h>
    using namespace std;
    int x[5000];
    int m[5000],n[5000];
    int main()
    {
        string a,b;
        cin>>a>>b;
        for(int i=1; i<=a.size(); i++)
            m[i]=a[a.size()-i]-'0';
        for(int i=1; i<=b.size(); i++)
            n[i]=b[b.size()-i]-'0';
        for(int i=1; i<=a.size(); i++)
            for(int j=1; j<=b.size(); j++)
                x[i+j-1]+=m[i]*n[j];
        for(int i=1; i<=a.size()+b.size(); i++)
        {
            if(x[i]>=10)
            {
                x[i+1]+=x[i]/10;
                x[i]=x[i]%10;
            }
        }
        int len=a.size()+b.size();
        while(x[len]==0)
        {
            len--;
            if(len==0)
            {
                printf("0");
                return 0;
            }
        }
        for(int i=len; i>=1; i--)
            printf("%d", x[i]);
    }

    做法:先将两个读入的数字字符串倒着装到两个整形数组中,然后模拟乘法,然后每一位数字/10是多少下一位加多少,本位对10取余,最后从末第一个不为零的数字倒着输出即可

  • 相关阅读:
    android的一些类库的优缺点
    中文后乱码问题的解决方法(可能解决)
    android data recovery and nc
    最短路径——Floyd,Dijkstra(王道)
    还是畅通工程——最小生成树(王道)
    More is better——并查集求最大集合(王道)
    畅通工程——并查集(王道)
    IDEA默认VIM模式
    命令行杀死进程
    进制转换——高精度整数(王道)
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10542379.html
Copyright © 2020-2023  润新知