【模板。。。】高精度。。。


活活被高精度搞死,看到学长博客里各种诡异的操作简直窒息,自己默默决定选择用低配版高精

http://blog.csdn.net/loi_dqs/article/details/49105107


先从学长这拽来一份。。。。看得头晕【晕】
支持加减乘除模五种运算,减法依旧是不支持小减大。。。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int size=10010;
const int BASE=(int)1e9;
const int WIDTH=9;
typedef long long LL;
struct bign
{
    int len,num[size];
    bign(){memset(num,0,sizeof(num));len=1;}
    bign(LL x)
    {
        memset(num,0,sizeof(num));len=0;
        do
        {
            num[++len]=x%BASE;
            x/=BASE;
        }while(x);
    }
};
inline void scanf(bign &ans)
{
    string in;
    cin>>in;
    int l=in.length();
    ans.len=(l-1)/WIDTH+1;
    for(int i=0;i<ans.len;i++)
    {
        int e=l-i*WIDTH;
        int s=max(0,e-WIDTH);
        sscanf(in.substr(s,e-s).c_str(),"%d",&ans.num[i+1]);
    }
}
inline void printf(const bign &ans)
{
    printf("%d",ans.num[ans.len]);
    for(int i=ans.len-1;i>=1;i--)
    {
        printf("%09d",ans.num[i]); 
    }
}
bool operator <(const bign &a,const bign &b)
{
    if(a.len!=b.len) return a.len<b.len;
    for(int i=a.len;i>=1;i--)
        if(a.num[i]!=b.num[i]) return a.num[i]<b.num[i];
    return false;
}
bign operator +(const bign &a,const bign &b)
{
    bign ans;
    int i=1,x=0;
    while(i<=a.len||i<=b.len)
    {
        x=a.num[i]+b.num[i]+x;
        ans.num[i++]=x%BASE;
        x/=BASE;
    }
    ans.num[i]=x;
    ans.len=i;
    while(ans.len>1&&ans.num[ans.len]==0) ans.len--;
    return ans;
}
bign operator -(const bign &a,const bign &b)
{
    bign ans;
    ans.len=a.len;
    for(int i=1,x=0;i<=a.len;i++)
    {
        x=BASE+a.num[i]-b.num[i]+x;
        ans.num[i]=x%BASE;
        x=x/BASE-1;
    }
    while(ans.len>1&&ans.num[ans.len]==0) ans.len--;
    return ans;
}
bign operator *(const bign &a,const bign &b)
{
    bign ans;
    ans.len=a.len+b.len;
    for(int i=1;i<=a.len;i++)
    {
        LL x=0;
        for(int j=1;j<=b.len;j++)
        {
            x+=ans.num[i+j-1]+(LL)a.num[i]*(LL)b.num[j];
            ans.num[i+j-1]=x%BASE;
            x/=BASE;
        }
        ans.num[i+b.len]=x;
    }
    while(ans.len>1&&ans.num[ans.len]==0) ans.len--;
    return ans; 
}
inline bool smaller(const bign &a,const bign &b,int d)
{
    if(a.len+d!=b.len) return a.len+d<b.len;
    for(int i=a.len;i>=1;i--)
        if(a.num[i]!=b.num[i+d]) return a.num[i]<b.num[i+d];
    return true;
}
inline void jian(bign &a,const bign &b,int d)
{
    for(int i=1,x=0;i<=a.len-d;i++)
    {
        x=BASE+a.num[i+d]-b.num[i]+x;
        a.num[i+d]=x%BASE;
        x=x/BASE-1;
    }
    while(a.len>1&&a.num[a.len]==0) a.len--;
}
bign operator /(const bign &a,const bign &b)
{
    bign ans;
    ans.len=max(1,a.len-b.len+1);
    bign mid[32],num=a;
    mid[0]=b;
    for(int i=1;i<=30;i++) mid[i]=mid[i-1]*2;
    for(int i=a.len-b.len;i>=0;i--)
    {
        int tmp=1<<30;
        for(int j=30;j>=0;j--)
        {
            if(smaller(mid[j],num,i))
            {
                jian(num,mid[j],i);
                ans.num[i+1]+=tmp;
            }
            tmp>>=1;
        }
    }
    while(ans.len>1&&ans.num[ans.len]==0) ans.len--;
    return ans;     
}
bign operator %(const bign &a,const bign &b)
{
    bign ans;
    ans.len=max(1,a.len-b.len+1);
    bign mid[32],num=a;
    mid[0]=b;
    for(int i=1;i<=30;i++) mid[i]=mid[i-1]*2;
    for(int i=a.len-b.len;i>=0;i--)
    {
        int tmp=1<<30;
        for(int j=30;j>=0;j--)
        {
            if(smaller(mid[j],num,i))
            {
                jian(num,mid[j],i);
                ans.num[i+1]+=tmp;
            }
            tmp>>=1;
        }
    }
    return num;     
}
int main()
{
    bign a,b,c,d,e,f,g,h,x,y;

    scanf(a);scanf(b);
    printf(a-b);

    scanf(c);scanf(d);
    printf(c+d);

    scanf(e);scanf(f);
    printf(e*f);

    scanf(g);scanf(h);
    printf(g/h);

    scanf(x);scanf(y);
    printf(x%y);
    return 0;
}


注:
对代码中一些东西的解释。。。

引自 http://blog.csdn.net/sjf0115/article/details/8579935
引自 http://blog.csdn.net/no_retreats/article/details/7853066


C++中scanff()的用法

//Scanff()
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
    char str[100];
    //用法一:取指定长度的字符串
    sscanf("12345","%4s",str);
    printf("用法一\nstr = %s\n",str);

    //用法二:格式化时间
    int year,month,day,hour,minute,second;
    sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
    printf("用法二\ntime = %d-%d-%d %d:%d:%d\n",year,month,day,hour,minute,second);

    //用法三:读入字符串
    sscanf("12345","%s",str);
    printf("用法三\nstr = %s\n",str);

    //用法四:%*d 和 %*s 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
    sscanf("12345acc","%*d%s",str);
    printf("用法四\nstr = %s\n",str);

    //用法五:取到指定字符为止的字符串。如在下例中,取遇到'+'为止字符串。
    sscanf("12345+acc","%[^+]",str);
    printf("用法五\nstr = %s\n",str);

    //用法六:取到指定字符集为止的字符串。如在下例中,取遇到小写字母为止的字符串。
    sscanf("12345+acc121","%[^a-z]",str);
    printf("用法六\nstr = %s\n",str);
    return 0;
}


输出效果:
这里写图片描述


C++中substr函数的用法

#include<string>
#include<iostream>
using namespace std;
main()
{
string s("12345asdf");
string a=s.substr(0,5);       //获得字符串s中 从第0位开始的长度为5的字符串//默认时的长度为从开始位置到尾
cout<<a<<endl;
}
输出结果为:
12345
发布了75 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_36693514/article/details/78301128
今日推荐