zoukankan      html  css  js  c++  java
  • 高精度计算

    高精度加法

    #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取余,最后从末第一个不为零的数字倒着输出即可

  • 相关阅读:
    【BZOJ 2820】 YY的GCD (莫比乌斯+分块)
    【BZOJ 2005】[Noi2010]能量采集 (容斥原理| 欧拉筛+ 分块)
    【HDU 4898】 The Revenge of the Princess’ Knight (后缀数组+二分+贪心+...)
    【BZOJ 3473】 字符串 (后缀数组+RMQ+二分 | 广义SAM)
    【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)
    【GDOI2014 DAY2】Beyond (扩展KMP)
    【转】【最大子矩阵问题】【悬线法】 学习笔记
    【HDU4333】Revolving Digits(扩展KMP+KMP)
    【转】各种字符串算法大总结
    【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10542379.html
Copyright © 2011-2022 走看看