首页 > 其他 > 详细

高精度模板

时间:2019-06-01 18:42:51      阅读:74      评论:0      收藏:0      [点我收藏+]

从我洛谷博客里搬运的,算是补发一下

1.高精度加法:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string x,y;
int  a[5000000],b[5000000],c[500000],lena,lenb,lenc,jb;
int main()
{
    cin>>x>>y;
    lena=x.length() ;
    lenb=y.length() ;
    for(int i=1;i<=lena;++i)
    {
        a[i]=x[lena-i]-'0';
    }
    for(int i=1;i<=lenb;++i)
    {
        b[i]=y[lenb-i]-'0';
    }
    while(lenc<=lena||lenc<=lenb)
    {
        c[lenc]=a[lenc]+b[lenc]+jb;
        jb=c[lenc]/10;
        c[lenc]=c[lenc]%10;
        lenc++;
    }
    c[lenc]=jb;
    while(c[lenc]==0&&lenc!=1)
    {
        lenc--;
    }
    for(int i=lenc;i>=1;--i)
    {
        cout<<c[i];
    }
    return 0;
}

2.高精度减法

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string x,y;
int bijiao(string xx,string yy)
{
    if(xx.length() < yy.length() )
    {
        return 1;
    }
    else if(xx.length() > yy.length() )
    {
        return 0;
    }
    else
    {
        for(int i=0;i<xx.length() ;++i)
        {
            if(xx[i]>yy[i])
            {
                return 0;
            }
            if(xx[i]<yy[i])
            {
                return 1;
            }
        }
    }
    return 0;
}
int  a[5000000],b[5000000],c[500000],lena,lenb,lenc=1,jb;
int main()
{
    cin>>x>>y;
    if(bijiao(x,y))
    {
        string g=x;
        x=y;
        y=g;
        cout<<"-";
    }
    lena=x.length() ;
    lenb=y.length() ;
    for(int i=1;i<=lena;++i)
    {
        a[i]=x[lena-i]-'0';
    }
    for(int i=1;i<=lenb;++i)
    {
        b[i]=y[lenb-i]-'0';
    }
    while(lenc<=lena||lenc<=lenb)
    {
        if(a[lenc]<b[lenc])
        {
            a[lenc]+=10;
            a[lenc+1]--;
        }
        c[lenc]=a[lenc]-b[lenc];
        lenc++;
    }
    while(c[lenc]==0&&lenc!=1)
    {
        lenc--;
    }
    for(int i=lenc;i>=1;--i)
    {
        cout<<c[i];
    }
    return 0;
}

注意减数和被减数的大小关系O(∩_∩)O~

3.高精度乘法:

一边乘一边进行进位操作

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string s1,s2;
int a[20000],b[20000],len1,len2,len3,c[20000]; 
int main()
{
    cin>>s1>>s2;
    len1=s1.length() ;
    len2=s2.length() ;
    for(int i=1;i<=len1;++i)
    {
        a[i]=s1[len1-i]-'0';
    }
    for(int i=1;i<=len2;++i)
    {
        b[i]=s2[len2-i]-'0';
    }
    int x;
    for(int i=1;i<=len1;++i)
    {
        x=0;
        for(int j=1;j<=len2;++j)
        {
            c[i+j-1]=a[i]*b[j]+c[i+j-1]+x;
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+len2]=x;//进最前面的一位O(∩_∩)O哈哈哈~划重点  
    }
    len3=len1+len2;
    while(c[len3]==0&&len3>1)
    {
        len3--;
    }
    for(int i=len3;i>=1;--i)
    {
        cout<<c[i];
    }
    return 0;
}

例子:求10000以内n的阶乘。

下例子中用到的高精乘法是先全乘起来吗,然后在进行处理进位等

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int a[1000000],n;
int main()
{
    cin>>n;
    int len=1;
    a[1]=1;
    int x;
    for(int i=2;i<=n;++i)
    {
        for(int j=1;j<=len;++j)
        {
            a[j]=a[j]*i; 
        }
        for(int k=1;k<=len;++k)
        {
            if(a[k]>9)
            {   
                a[k+1]+=a[k]/10;
                a[k]=a[k]%10;
                if(k==len)  len++;//最高位进位
            }                   
        }   
    }
    for(int i=len;i>=1;--i)
    {
        cout<<a[i];
    }
    return 0;
}

4.高精度除法:

(1)高精除单精

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string s1,s2;
int a[20000],b[20000],len1,len2,len3,c[20000];
int main() {
    cin>>s1;
    int g;
    cin>>g;
    len1=s1.length() ;
    for(int i=0; i<len1; ++i) {
        a[i+1]=s1[i]-'0';
    }
    int x=0;
    for(int i=1;i<=len1;++i)
    {
        c[i]=(x*10+a[i])/g;
        x=(x*10+a[i])%g;
    }
    len3=1;
    while(c[len3]==0&&len3<len1)
    {
        len3++;
    }
    for(int i=len3;i<=len1;++i)
    {
        cout<<c[i];
    }   
    return 0;
}

高精度总结:

1.注意最高位的处理。

2.注意删除前导0

高精度模板

原文:https://www.cnblogs.com/pyyyyyy/p/10960492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!