zoukankan      html  css  js  c++  java
  • [笔记]: 高精度 2017-05-22 10:27 36人阅读 评论(0) 收藏

    总结:
    关于高精度的计算 大体是一个套路
    模拟小学所学的计算过程(竖式计算)
    然后注意:1.进位 2.排除前导零

    2的乘方

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    int a[3010],b[3010],ans[10000];
    int main()
    {
        int n,wei=1;
        cin>>n;
        a[1]=2;
        while(n>1)
        {
            for(int i=1;i<=wei;i++)
            {
                a[i]=a[i]*2;
            }
            int i=1;
            while(a[i]>10)
            {
                if(i==wei) wei++;
                a[i+1]+=a[i]/10;
                a[i]=a[i]%10;
                i++;
            }
            n--;
        }
        for(int j=wei;j>=1;j--)
        {
            cout<<a[j];
        }
        return  0;
    }

    高精加法

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    char s[3010];
    char t[3010];
    int a[3010],b[3010];
    int main()
    {
        int la,lb,len;
        gets(s);
        gets(t);
        la=strlen(s);
        lb=strlen(t);
        if(la>lb) len=la;
        else len=lb;
        for(int i=0;i<=la-1;i++)    a[la-i]=s[i]-48;
        for(int i=0;i<=lb-1;i++)    b[lb-i]=t[i]-48;
        for(int i=1;i<=len;i++)   a[i]+=b[i];
        for(int i=1;i<=len;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        if(a[len+1]>0) len++;
        while(a[len]==0&&len>1) len--;
        for(int i=len;i>=1;i--) cout<<a[i];
        return  0;
    }
    

    高精减法

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    char s[3010];
    char t[3010];
    int a[3010],b[3010];
    int main()
    {
        int la,lb,lena,lenb;
        gets(s);
        gets(t);
        lena=strlen(s);
        lenb=strlen(t);
        la=lena;lb=lenb;
        for(int i=0;i<=la-1;i++)    a[la-i]=s[i]-48;
        for(int i=0;i<=lb-1;i++)    b[lb-i]=t[i]-48;
        if(lena>lenb||strcmp(s,t)>0&&la==lb){
        for(int i=1;i<=la;i++)  {
            if(a[i]<b[i]){
                a[i+1]--;
                a[i]+=10;
            }
            a[i]-=b[i];
        }
        while(a[la]==0&&la>1) la--;
        for(int i=la;i>=1;i--) cout<<a[i];
        }
        if(lena<lenb||strcmp(s,t)<0&&la==lb){
        for(int i=1;i<=lb;i++)  {
            if(b[i]<a[i]){
                b[i+1]--;
                b[i]+=10;
            }
            b[i]-=a[i];
        }
        while(b[lb]==0&&lb>1) lb--;
        for(int i=lb;i>=1;i--) cout<<b[i];
        }
        return  0;
    }

    实数加法

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    char s[3010];
    char t[3010];
    int a[3010],b[3010];
    int c[3010],d[3010];
    int main()
    {
        int la,lb,len;
        bool flag=0;
        gets(s);
        gets(t);
        la=strlen(s);
        lb=strlen(t);
        int lena,lenb;
        for(int i=1;i<=la;i++){
            if(s[i]=='.')
                lena=i;
        }
        for(int i=1;i<=lb;i++){
            if(t[i]=='.')
                lenb=i;
        }
    
        //for(int i=len;i>=1;i--) cout<<a[i];整数部分
    
        //for(int i=lena+1;i<=la-1;i++)    c[i-lena]=s[i]-48;
        //for(int i=lenb+1;i<=lb-1;i++)    d[i-lenb]=t[i]-48;
        int lla=la-lena-1;
        int llb=lb-lenb-1;
        int llen=max(lla,llb);
        for(int i=llen+lena;i>=lena+1;i--)  {
            if(s[i]>='0'&&s[i]<='9')
            c[lena+llen+1-i]=s[i]-48;
        }
        for(int i=llen+lenb;i>=lenb+1;i--)  {
            if(t[i]>='0'&&t[i]<='9')
            d[lenb+llen+1-i]=t[i]-48;
        }
        for(int i=1;i<=llen;i++)    c[i]+=d[i];
        for(int i=1;i<=llen;i++)
        {
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
        if(c[llen+1]>0) flag=1;
        int p=1;
        while(c[p]==0){
            p++;
        }
        len=max(lena,lenb);
        for(int i=0;i<=lena-1;i++)    a[lena-i]=s[i]-48;
        for(int i=0;i<=lenb-1;i++)    b[lenb-i]=t[i]-48;
        if(flag==1) a[1]++;
        for(int i=1;i<=len;i++)   a[i]+=b[i];
        for(int i=1;i<=len;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        if(a[len+1]>0) len++;
        while(a[len]==0&&len>1) len--;
        //for(int i=llen;i>=p;i--)
        //   cout<<c[i];
        for(int i=len;i>=1;i--) cout<<a[i];
        cout<<".";
        for(int i=llen;i>=p;i--) cout<<c[i];
        return  0;
    }

    高精度乘单精度

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    int a[3010];
    char b[3010];
    int main()
    {
        int n,len=1;
        gets(b);
        len=strlen(b);
        cin>>n;
        for(int i=0;i<=len-1;i++)
        {
            a[i]=b[i]-48;
        }
        for(int i=0;i<=len-1;i++) a[i]*=n;
        for(int i=0;i<=len-1;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        int t=a[len];
        while(t>0) {
                len++;
                a[len]=t%10;
                t/=10;
            }
        while(a[len]==0&&len>1) len--;
        for(int i=len-1;i>=0;i--)
        {
            cout<<a[i];
        }
        return  0;
    }
    

    高精度乘高精度

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[1000],b[1000],c[1000],d[1000];
    char s[1000],t[1000];
    int la,lb,len;
    bool judge()
    {
       for(int i=len;i>=1;i--)
       {
           if(d[i]<b[i])   return false;
           else if(d[i]>b[i]) return true;
       }
       return true;
    }
    void jian()
    {
        for(int i=1;i<=len;i++)  {
            if(d[i]<b[i]){
                d[i+1]--;
                d[i]+=10;
            }
            d[i]-=b[i];
        }
    }
    void cheng()
    {
        for(int i=1;i<=len;i++) d[i]*=10;
        for(int i=1;i<=len;i++)
        {
            d[i+1]+=d[i]/10;
            d[i]%=10;
        }
        int t=d[len+1];
        while(t>0) {
                len++;
                d[len]=t%10;
                t/=10;
            }
    }
    int main(){
        gets(s);gets(t);
        la=strlen(s);lb=strlen(t);
        for(int i=0;i<=la-1;i++) a[la-i]=s[i]-48;
        for(int i=0;i<=lb-1;i++) b[lb-i]=t[i]-48;
        len=la;
        for(int i=len;i>=1;i--)
        {
            d[1]=a[i];
            while(judge())
            {
                c[i]++;
                jian();
            }
            cheng();
        }
        while(c[len]==0&&len>1)len--;
        for(int i=len;i>=1;i--) cout<<c[i];
        return 0;
     }

    高精度除单精度

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    char s[3010];
    char t[3010];
    int a[3010],b[3010],c[3010];
    int main()
    {
        int len,n,t=0;
        gets(s);
        len=strlen(s);
        for(int i=0;i<=len-1;i++)    a[len-i]=s[i]-48;
        cin>>n;
        for(int i=len;i>=1;i--)
        {
            t=t*10+a[i];
            b[i]=t/n;
            t%=n;
        }
        while(b[len]==0&&len>1) len--;
        for(int i=len;i>=1;i--)
        {
            cout<<b[i];
        }
        return  0;
    }
    

    高精度除高精度(最难)

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[1000],b[1000],c[1000],d[1000];
    char s[1000],t[1000];
    int la,lb,len;
    bool judge()//判断大小的函数
    {
       for(int i=len;i>=1;i--)
       {
           if(d[i]<b[i])   return false;
           else if(d[i]>b[i]) return true;
       }
       return true;
    }
    void jian()//高精度减法
    {
        for(int i=1;i<=len;i++)  {
            if(d[i]<b[i]){
                d[i+1]--;
                d[i]+=10;
            }
            d[i]-=b[i];
        }
    }
    void cheng()//高精度乘法 乘10(做除法时的计算)
    {
        for(int i=1;i<=len;i++) d[i]*=10;
        for(int i=1;i<=len;i++)
        {
            d[i+1]+=d[i]/10;
            d[i]%=10;
        }
        int t=d[len+1];
        while(t>0) {
                len++;
                d[len]=t%10;
                t/=10;
            }
    }
    int main(){
        gets(s);gets(t);
        la=strlen(s);lb=strlen(t);
        for(int i=0;i<=la-1;i++) a[la-i]=s[i]-48;
        for(int i=0;i<=lb-1;i++) b[lb-i]=t[i]-48;
        len=la;
        for(int i=len;i>=1;i--)
        {
            d[1]=a[i];
            while(judge())
            {
                c[i]++;
                jian();
            }
            cheng();
        }
        while(c[len]==0&&len>1)len--;
        for(int i=len;i>=1;i--) cout<<c[i];
        return 0;
     }
  • 相关阅读:
    PostCSS: 跨浏览器兼容性
    js延迟执行函数
    angularjs怎么做动jq中toggle (ng-toggle in AngularJS )
    elasticsearch权威指南
    docker 运行 elasticsearch + kibana + head 集群
    RabbitMQ 的基本介绍
    docker 安装rabbitMQ
    Docker WARNING: IPv4 forwarding is disabled. Networking will not work.
    nginx 的 负载均衡
    Nginx 的 docker 部署
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183651.html
Copyright © 2011-2022 走看看