• 高精度加减乘除,嗯嗯嗯嗯


    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<string>
    using namespace std;
    
    int myMax(int x,int y){ return x>y?x:y; }
    
    void print(int a[],int end)
    {
        cout <<"{";
        for(int i=a[0];i>=end;i--) cout << a[i];
        cout <<"}";
    }
    
    int cmp(int a[],int b[],int x)
    {
        if(a[0]-x+1>b[0]) return 1;
        if(a[0]-x+1<b[0]) return -1;
        for(int i=a[0];i>=x;i--)
        {
            int pos = b[0]-a[0]+i;
            if(a[i]>b[pos])    return 1;
            if(a[i]<b[pos]) return -1;
        } 
        return 1;
    }
    void div2(int a[],int b[],int c[])
    {
        string s1,s2;
        cin >> s1 >> s2;
        for(int i=0;i<100;i++) a[i]=b[i]=c[i]=0;
        a[0]=s1.length();
        b[0]=s2.length();
        for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
        for(int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-'0';
        c[0]=a[0]-b[0]+1; 
        int x = a[0]-b[0]+1;
        while(x>=1)
        {
            print(a,x); cout << endl;
            print(b,1); cout << endl;
            if(cmp(a,b,x)==1)
            {
                c[x]++;
                for(int i=x;i<=b[0]+x-1;i++)
                {
                    if(a[i]<b[i-x+1]) 
                    {
                        a[i+1]--;
                        a[i]+=10;
                    }
                    a[i]-=b[i-x+1];
                }
                while(a[a[0]]==0 && a[0]!=1) a[0]--;
            }    
            else
            {
                x--; 
            }    
        }
        while(c[c[0]]==0 && c[0]!=1) c[0]--;
        for(int i=0;i<c[0];i++) cout << c[c[0]-i];  cout <<endl;//result
        for(int i=0;i<a[0];i++) cout << a[a[0]-i];  cout <<endl;    
    }  
    void div(int a[],int b,int c[])//高精度除以低精度 
    {
        string s;
        cin >> s;
        cin >> b;
        for(int i=0;i<100;i++) a[i]=c[i]=0;
        c[0]=a[0]=s.length();
        for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0';
        
        int data = 0,x=a[0];
        while(x>=1)
        {
            data = data*10+a[x];
            c[x] = data/b;
            data %= b;
            x--;
        }
        while(c[c[0]]==0 && c[0]!=1) c[0]--;
        for(int i=0;i<c[0];i++) cout << c[c[0]-i];
    }
    void mul(int a[],int b[],int c[])
    {
        string s1,s2;
        cin >> s1 >> s2;
        for(int i=0;i<100;i++) a[i]=b[i]=c[i]=0;
        a[0]=s1.length();
        b[0]=s2.length();
        c[0]=a[0]+b[0];
        for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
        for(int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-'0';
        for(int i=1;i<=a[0];i++)
        {
            int x = 0;
            for(int j=1;j<=b[0];j++)
            {
                c[i+j-1]+=a[i]*b[j]+x;
                x = c[i+j-1]/10;
                c[i+j-1]%=10;
            }
            c[i+b[0]]+=x;
        }
        while(c[c[0]]==0 && c[0]!=1) c[0]--;
        for(int i=0;i<c[0];i++) cout << c[c[0]-i]; 
    }
    void sub(int a[],int b[],int c[])//假设a>=b 
    {
        string s1,s2;
        cin >> s1 >> s2;
        for(int i=0;i<100;i++) a[i]=b[i]=c[i]=0;
        a[0]=s1.length();
        b[0]=s2.length();
        c[0]=myMax(a[0],b[0]);
        for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
        for(int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-'0';
        for(int i=1;i<=c[0];i++)
        {
            if(a[i]<b[i])
            {
                a[i]+=10;
                a[i+1]--;
            }
            c[i]=a[i]-b[i];
        }
        while(c[c[0]]==0 && c[0]!=1) c[0]--;
        for(int i=0;i<c[0];i++) cout << c[c[0]-i];
    }
    void add(int a[],int b[],int c[])
    {
        string s1,s2;
        cin >> s1 >> s2;
        for(int i=0;i<100;i++) a[i]=b[i]=c[i]=0; 
        a[0]=s1.length();
        b[0]=s2.length();
        c[0]=myMax(a[0],b[0])+1;
        for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
        for(int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-'0';
        
        for(int i=1;i<=c[0];i++)
        {
            
            c[i]+=a[i]+b[i];
            if(c[i]>=10)
            {
                c[i+1]++;
                c[i]%=10;
            }
        }
        while(c[c[0]]==0 && c[0]!=1) c[0]--;
        for(int i=1;i<=c[0];i++) cout << c[c[0]-i+1];
    } 
    void init(int a[])
    {
        string s;
        cin >> s;
        a[0]=s.length();
        for(int i=1;i<=a[0];i++)
            a[i]=s[a[0]-i]-'0';
        for(int i=1;i<=a[0];i++)
            cout << a[i] << endl;
    }
    int main(void)
    {
        freopen("d://1.txt","r",stdin);
        int a[100],b[100],c[100],d;
        //init(a);
        //add(a,b,c);
        //sub(a,b,c);
        //mul(a,b,c);
        //div(a,d,c);
        div2(a,b,c);
        return 0;
    } 
  • 相关阅读:
    Ubuntu终端Terminal常用快捷键
    继承(一)
    c语言中动态数组的建立
    指针的一些小的知识点
    什么是内存地址
    组合(composition)与继承(inheritance)
    重载new和delete
    不要轻易delete void*指针,这样会隐藏比较多的错误。
    内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。
    自动类型转换之全局重载运算符与成员重载运算符
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/10458225.html
Copyright © 2020-2023  润新知