【算法】高精四则运算

高精度加法

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    char a[200],b[200];
    int a1[200],b1[200],c1[200];
    int l1,l2,l3;
    int main()
    {
        scanf("%s",a);
        scanf("%s",b);
        l1=strlen(a);
        l2=strlen(b);
        for(int i=0;i<=strlen(a)-1;i++)
        a1[l1-i]=a[i]-48;
        for(int i=0;i<=strlen(b)-1;i++)
        b1[l2-i]=b[i]-48;
        int k=0;
        l3=1;
        while(l3<=l1||l3<=l2)
        {
            c1[l3]=a1[l3]+b1[l3]+k;
            k=c1[l3]/10;
            c1[l3]%=10;
            l3++;
        }
        c1[l3]=k;
        if(c1[l3]==0)
        l3--;
        for(int i=l3;i>=1;i--)
        cout<<c1[i];
    }


高精度减法(只支持两个正整数)

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    char a[200],b[200],n[200];
    int a1[200],b1[200],c1[200];
    int l1,l2,l3;
    int main()
    {
        scanf("%s",a);
        scanf("%s",b);
        if(strlen(a)<strlen(b)||(strlen(a)==strlen(b)&&strcmp(a,b)<0))
        {
            strcpy(n,a);
            strcpy(a,b);
            strcpy(b,n);
            cout<<"-";
        }
        l1=strlen(a);
        l2=strlen(b);
        for(int i=0;i<=strlen(a)-1;i++)
        a1[l1-i]=a[i]-48;
        for(int i=0;i<=strlen(b)-1;i++)
        b1[l2-i]=b[i]-48;
        l3=1;
        while(l3<=l1||l3<=l2)
        {
            if(a1[l3]<b1[l3])
            {
                a1[l3]+=10;
                a1[l3+1]--;
            }
            c1[l3]=a1[l3]-b1[l3];
            l3++;
        }
        while((c1[l3]==0)&&l3>1)
        l3--;
        for(int i=l3;i>=1;i--)
        cout<<c1[i];
    }


高精度乘法

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    char a[2002],b[2002];
    int a1[2002],b1[2002],c1[4040];
    int l1,l2,l3;
    int k;
    int main()
    {
        scanf("%s",a);
        scanf("%s",b);
        l1=strlen(a);
        l2=strlen(b);
        for(int i=0;i<=l1-1;i++)
        a1[l1-i]=a[i]-48;
        for(int i=0;i<=l2-1;i++)
        b1[l2-i]=b[i]-48;
        for(int i=1;i<=l1;i++)
        {
            k=0;
            for(int j=1;j<=l2;j++)
            {
                c1[i+j-1]=c1[i+j-1]+k+a1[i]*b1[j];
                k=c1[i+j-1]/10;
                c1[i+j-1]%=10;
            }
            c1[l2+i]=k;
        }
        l3=l1+l2;
        while(l3>1&&c1[l3]==0)
        l3--;
        for(int i=l3;i>=1;i--)
        cout<<c1[i];
    }


高精度除法(高精除以高精)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[200],b[200],c[200],tem[200];
    void intt (int a[])
    {
        string s;
        cin>>s;
        a[0]=s.length();
        for(int i=1;i<=a[0];i++)
        a[i]=s[a[0]-i]-48;
    }
    void print(int a[])
    {
        if(a[0]==0)
        {
            cout<<0<<endl;
            return;
        }
        for(int i=a[0];i>=1;i--)
        cout<<a[i];
        cout<<endl;
    }
    int compare(int a[],int b[])
    {
        if(a[0]>b[0])
        return 1;
        if(a[0]<b[0])
        return -1;
        for(int i=a[0];i>=1;i--)
        {
            if(a[i]>b[i])
            return 1;
            if(a[i]<b[i])
            return -1;
        }
        return 0;
    }
    int charu(int b[],int tem[],int k)
    {
        for(int i=1;i<=b[0];i++)
        tem[i+k-1]=b[i];
        tem[0]=b[0]+k-1;
    }
    void jian(int a[],int b[])
    {
        int flag;
        flag=compare(a,b);
        if(flag==0)
        {
            a[0]=0;
            return;
        }
        if(flag==1)
        {
            for(int i=1;i<=a[0];i++)
            {
                if(a[i]<b[i])
                {
                    a[i]+=10;
                    a[i+1]-=1;
                }
                a[i]=a[i]-b[i];
            }
            while(a[0]>0&&a[a[0]]==0)
            a[0]--;
        }
    }
    void chufa(int a[],int b[],int c[])
    {
        c[0]=a[0]-b[0]+1;
        for(int i=c[0];i>=1;i--)
        {
            memset(tem,0,sizeof(tem));
            charu(b,tem,i);
            while(compare(a,tem)>=0)
            {
                c[i]++;
                jian(a,tem);
            }
        }
        while(c[0]>0&&c[c[0]]==0)
        c[0]--;
    }
    int main()
    {
        intt(a);
        intt(b);
        chufa(a,b,c);
        print(a);
        print(c);
    }


高精度除法(高精除以低精)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a1[20001],b1[20001];
    char a[20001];
    int l1,l2,x=0,b;
    int main()
    {
        scanf("%s",a);
        l1=strlen(a);
        cin>>b;
        for(int i=0;i<=l1-1;i++)
        a1[i+1]=a[i]-48;
        l2=1;
        for(int i=1;i<=l1;i++)
        {
            b1[i]=(10*x+a1[i])/b;
            x=(x*10+a1[i])%b;
        }
        while(b1[l2]==0&&l2<l1)
        l2++;
        for(int i=l2;i<=l1;i++)
        cout<<b1[i];
}

原文地址:https://www.cnblogs.com/BrokenString/p/9279542.html

时间: 2024-07-31 11:35:16

【算法】高精四则运算的相关文章

【模板】高精算法

利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度.我们可以利用程序设计的方法去实现这样的高精度计算.介绍常用的几种高精度计算的方法. 高精度计算中需要处理好以下几个问题: 1)数据的接收方法和存贮方法 数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中.另一种方法是直接用循环

BZOJ_1002_[FJOI2007]_轮状病毒(递推+高精)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 分析 题目是求一种特殊的图的生成树的个数,但是貌似有更一般的算法,等明天再看吧... 只搞懂了打表找规律,然后题推的解法. 随便写个暴力打个表(其实我并不会写,明天再写吧今天好累),找一找规律. 1~14的答案如下 1 5 16 45 121 320 841 2205 5776 15125 39601 103680 271441 71

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

[BZOJ 2729][HNOI2012]排队(排列组合+高精)

Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) Solution 好像必须写压位高精的QAQ 先排n名男生,插空,讨论两名老师插在两个不同的空里的情况和先排在一起再在中间插一名女生的情况 #include<iostream> #include<cstdio> #include<cstring> #include&

高精-----各种模板

高精加法 代码 #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[501]; int x[501],y[501],z[50000]; int main() { cin>>a; cin>

模板——高精系列

存放一下高精的模板 高精加: #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int a[1001],b[1001],c[1001],lena,lenb; char a1[1001],b1[1001]; int main(){ gets(a1); gets(b1); lena=strlen(a1); lenb=strlen

c++普通高精加

//作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio>#include<cstring>int main(){char s1[600],s2[600];int a1[600],a2[600],a3[600]={0},len1,len2,i;scanf("%s",s1);scanf("%s",s2);len1

高精阶乘

求n!.当n很大的时候,会超出整数的范围. 这里用数组来进行高精阶乘.a[1]是个位,a[2]是十位......依次类推.每次要乘一个数的时候,就从个位(即a[1])开始乘这个数,>10的时候要%10再进位. 1 #include<cstdio> 2 #include<cstring> 3 const int N=100000; 4 5 int a[N]; 6 int i, j, n; 7 int t, pos/*位数*/, carry/*进位*/; 8 9 int main

bzoj 3287: Mato的刷屏计划 高精水题 &amp;&amp; bzoj AC150

3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Description Mato同学喜欢上QQ,但是有少数傻逼总是问他一些弱智问题.Mato感到很反感,想要鄙视一下他们.他决定在QQ上刷屏,也就是发出一大堆字符.Mato的键盘上有4个键:A.B.C.D.按A就会输入一个字符,按B会把所有字符选中,按C会把选中的字符放入剪贴板,按D会插入剪贴板的内容.他的