zoukankan      html  css  js  c++  java
  • 【算法】高精四则运算

    高精度加法

        #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];
    }
    
  • 相关阅读:
    HDU 4861 Couple doubi(数论)
    POJ 3233 Matrix Power Series 二分+矩阵乘法
    js原生offsetParent解析
    ADS-B显示终端6.8
    模板
    习题四——数字智力题
    Android ORMLite ForeignCollection关联外部集合
    Android应用程序无法读写USB设备的解决方法
    [学习笔记]批次需求计划-十一大量
    jqury+css实现可弹出伸缩层
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9279542.html
Copyright © 2011-2022 走看看