高精度模板---加、减、乘(非负数)

来源:互联网 发布:乐其网络 编辑:程序博客网 时间:2024/05/16 06:26
#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;struct Bigint{    bool f; // 0:+  1; -   符号判断(可忽略)    int size; //数位    int num[20000]; //数值    // 重载: 与函数类似,返回值类型 + operator + 重载符号 + ( 运算符右边的元素类型 )     // ps: 1.可以重载多个相同的运算符,不过要保证不完全相同 即  算符右边的元素类型不同( 高精*高精  高精*单精 )     //     2.本模板仅限于非负数之间的操作  , 如有负数,需加一些判断(ans正负 , 正+负==正- |负| )和处理(符号处理)    //     3.除法略过(。。。。。) ,多半取模    inline void swap_(Bigint &x,Bigint &y)    {        Bigint tmp=x; x=y; y=tmp;    }    inline void swap_(int &x,int &y)    {        int tmp=x; x=y; y=tmp;    }    inline void del(Bigint &b)//去前导0     {        for(;!b.num[b.size] && b.size>1;--(b.size));    }    bool operator < (const Bigint &b) const    {        if(size!=b.size) return size<b.size;        for(int i=1;i<=size;++i)        if(num[i]^b.num[i])  // 等价于  num[i]!=b.num[i]            return num[i]<b.num[i];        return 0;    }    Bigint operator + (const Bigint &b) //const + & 定义的元素不可更改     { // 高精+高精         Bigint p={0}; //同局部变量,必须要初始化         int m=size>b.size?size:b.size;        int r=0;        for(int i=1;i<=m;++i)        {            r+=num[i]+b.num[i];            p.num[i]=r%10;            r/=10;        }        for(;r;r/=10)            p.num[++m]=r%10;        p.size=m;        return p;    }     Bigint operator - (Bigint b)//不能改变原来的数值,所以不引用     {        Bigint p=*this; // *this 等价 于 本结构体         if(p < b) { swap_(p,b); p.f=1; }        int m=p.size>b.size?p.size:b.size;        for(int i=1;i<=m;++i)        {            p.num[i]-=b.num[i];            if(p.num[i]<0) {p.num[i]+=10; --(p.num[i+1]);}        }        p.size=m;        del(p);        return p;    }    //对于乘法 当数值为1时,考虑删除前导0    Bigint operator * (const int x)    {// 高精 * 单精         Bigint p={0};        int r=0,m=size;        for(int i=1;i<=size;++i)        {            r+=num[i]*x;            p.num[i]=r%10;            r/=10;        }        for(;r;r/=10)            p.num[++m]=r%10;        p.size=m;        del(p);        return p;    }    Bigint operator * (const Bigint &b)    {//高精 * 高精         Bigint p={0};        int r=0,m=size+b.size-1,p1=0;        for(int i=1;i<=size;++i)        {            for(int j=1;j<=b.size;++j)            {                r+=num[i]*b.num[j]+p.num[i+j-1];                p.num[i+j-1]=r%10;                r/=10;            }            for(p1=i+b.size-1;r;r/=10)            {                r+=p.num[++p1];                p.num[p1]=r%10;            }            if(p1>m) m=p1;        }         p.size=m;        del(p);         return p;    }    inline void turn (int x) //转化 (看情况,可改 long long)    {        for(;x;x/=10)            num[++size]=x%10;    }     inline void in() //读入     {        char c=getchar();        for(;'0'>c || c>'9';c=getchar());        for(;'0'<=c && c<='9';c=getchar())            num[++size]=c-'0';        for(int l=1,r=size;l<r;)            swap_(num[l++],num[r--]);    }    inline void out() //输出     {        if(f) putchar('-');         for(int i=size;i;--i)            putchar(num[i]+'0');        putchar('\n');//自动换行 , 可删去     }}zero={0,1,0},one={0,1,{0,1}},two={0,1,{0,2}}; //常用数字 ;注意0的位数一定不能为0,否则不能输出 Bigint a,b,c;int main(){     printf("test:\n");    printf("请输入两串数字:\n");    a.in();    b.in();    printf("a+b: "); (a+b).out();    printf("a-b: "); (a-b).out();    printf("a*b: "); (a*b).out();    printf("a;"); a.out();    printf("b: "); b.out();    putchar('\n');    int x;    printf("请输入一个int范围内的数:\n");    scanf("%d",&x);    c.turn(x);    printf("c: "); c.out();        printf("a*x: "); (a*x).out();       printf("a*c: "); (a*c).out();         system("pause");    return 0;}
原创粉丝点击