高精度板子

来源:互联网 发布:nginx lua 变量 编辑:程序博客网 时间:2024/05/21 09:57

给大家分享一个好用的高精板子。

#include<string>#include<iostream>#include<iosfwd>#include<cmath>#include<cstring>#include<stdlib.h>#include<stdio.h>#include<cstring>#define MAX_L 2005 //????,????using namespace std;class bign{public:    int len, s[MAX_L];//????,????//????    bign();    bign(const char*);    bign(int);    bool sign;//?? 1?? 0??    string toStr() const;//??????,???????    friend istream& operator>>(istream &,bign &);//?????    friend ostream& operator<<(ostream &,bign &);//?????//????    bign operator=(const char*);    bign operator=(int);    bign operator=(const string);//??????    bool operator>(const bign &) const;    bool operator>=(const bign &) const;    bool operator<(const bign &) const;    bool operator<=(const bign &) const;    bool operator==(const bign &) const;    bool operator!=(const bign &) const;//??????    bign operator+(const bign &) const;    bign operator++();    bign operator++(int);    bign operator+=(const bign&);    bign operator-(const bign &) const;    bign operator--();    bign operator--(int);    bign operator-=(const bign&);    bign operator*(const bign &)const;    bign operator*(const int num)const;    bign operator*=(const bign&);    bign operator/(const bign&)const;    bign operator/=(const bign&);//?????????    bign operator%(const bign&)const;//??(??)    bign factorial()const;//??    bign Sqrt()const;//????(????)    bign pow(const bign&)const;//??//???????    void clean();    ~bign();};#define max(a,b) a>b ? a : b#define min(a,b) a<b ? a : bbign::bign(){    memset(s, 0, sizeof(s));    len = 1;    sign = 1;}bign::bign(const char *num){    *this = num;}bign::bign(int num){    *this = num;}string bign::toStr() const{    string res;    res = "";    for (int i = 0; i < len; i++)        res = (char)(s[i] + '0') + res;    if (res == "")        res = "0";    if (!sign&&res != "0")        res = "-" + res;    return res;}istream &operator>>(istream &in, bign &num){    string str;    in>>str;    num=str;    return in;}ostream &operator<<(ostream &out, bign &num){    out<<num.toStr();    return out;}bign bign::operator=(const char *num){    memset(s, 0, sizeof(s));    char a[MAX_L] = "";    if (num[0] != '-')        strcpy(a, num);    else        for (int i = 1; i < strlen(num); i++)            a[i - 1] = num[i];    sign = !(num[0] == '-');    len = strlen(a);    for (int i = 0; i < strlen(a); i++)        s[i] = a[len - i - 1] - 48;    return *this;}bign bign::operator=(int num){    char temp[MAX_L];    sprintf(temp, "%d", num);    *this = temp;    return *this;}bign bign::operator=(const string num){    const char *tmp;    tmp = num.c_str();    *this = tmp;    return *this;}bool bign::operator<(const bign &num) const{    if (sign^num.sign)        return num.sign;    if (len != num.len)        return len < num.len;    for (int i = len - 1; i >= 0; i--)        if (s[i] != num.s[i])            return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i]));    return !sign;}bool bign::operator>(const bign&num)const{    return num < *this;}bool bign::operator<=(const bign&num)const{    return !(*this>num);}bool bign::operator>=(const bign&num)const{    return !(*this<num);}bool bign::operator!=(const bign&num)const{    return *this > num || *this < num;}bool bign::operator==(const bign&num)const{    return !(num != *this);}bign bign::operator+(const bign &num) const{    if (sign^num.sign)    {        bign tmp = sign ? num : *this;        tmp.sign = 1;        return sign ? *this - tmp : num - tmp;    }    bign result;    result.len = 0;    int temp = 0;    for (int i = 0; temp || i < (max(len, num.len)); i++)    {        int t = s[i] + num.s[i] + temp;        result.s[result.len++] = t % 10;        temp = t / 10;    }    result.sign = sign;    return result;}bign bign::operator++(){    *this = *this + 1;    return *this;}bign bign::operator++(int){    bign old = *this;    ++(*this);    return old;}bign bign::operator+=(const bign &num){    *this = *this + num;    return *this;}bign bign::operator-(const bign &num) const{    bign b=num,a=*this;    if (!num.sign && !sign)    {        b.sign=1;        a.sign=1;        return b-a;    }    if (!b.sign)    {        b.sign=1;        return a+b;    }    if (!a.sign)    {        a.sign=1;        b=bign(0)-(a+b);        return b;    }    if (a<b)    {        bign c=(b-a);        c.sign=false;        return c;    }    bign result;    result.len = 0;    for (int i = 0, g = 0; i < a.len; i++)    {        int x = a.s[i] - g;        if (i < b.len) x -= b.s[i];        if (x >= 0) g = 0;        else        {            g = 1;            x += 10;        }        result.s[result.len++] = x;    }    result.clean();    return result;}bign bign::operator * (const bign &num)const{    bign result;    result.len = len + num.len;    for (int i = 0; i < len; i++)        for (int j = 0; j < num.len; j++)            result.s[i + j] += s[i] * num.s[j];    for (int i = 0; i < result.len; i++)    {        result.s[i + 1] += result.s[i] / 10;        result.s[i] %= 10;    }    result.clean();    result.sign = !(sign^num.sign);    return result;}bign bign::operator*(const int num)const{    bign x = num;    bign z = *this;    return x*z;}bign bign::operator*=(const bign&num){    *this = *this * num;    return *this;}bign bign::operator /(const bign&num)const{    bign ans;    ans.len = len - num.len + 1;    if (ans.len < 0)    {        ans.len = 1;        return ans;    }    bign divisor = *this, divid = num;    divisor.sign = divid.sign = 1;    int k = ans.len - 1;    int j = len - 1;    while (k >= 0)    {        while (divisor.s[j] == 0) j--;        if (k > j) k = j;        char z[MAX_L];        memset(z, 0, sizeof(z));        for (int i = j; i >= k; i--)            z[j - i] = divisor.s[i] + '0';        bign dividend = z;        if (dividend < divid) { k--; continue; }        int key = 0;        while (divid*key <= dividend) key++;        key--;        ans.s[k] = key;        bign temp = divid*key;        for (int i = 0; i < k; i++)            temp = temp * 10;        divisor = divisor - temp;        k--;    }    ans.clean();    ans.sign = !(sign^num.sign);    return ans;}bign bign::operator/=(const bign&num){    *this = *this / num;    return *this;}bign bign::operator%(const bign& num)const{    bign a = *this, b = num;    a.sign = b.sign = 1;    bign result, temp = a / b*b;    result = a - temp;    result.sign = sign;    return result;}bign bign::pow(const bign& num)const{    bign result = 1;    for (bign i = 0; i < num; i++)        result = result*(*this);    return result;}bign bign::factorial()const{    bign result = 1;    for (bign i = 1; i <= *this; i++)        result *= i;    return result;}void bign::clean(){    if (len == 0) len++;    while (len > 1 && s[len - 1] == '\0')        len--;}bign bign::Sqrt()const{    if(*this<0)return -1;    if(*this<=1)return *this;    bign l=0,r=*this,mid;    while(r-l>1)    {        mid=(l+r)/2;        if(mid*mid>*this)            r=mid;        else            l=mid;    }    return l;}bign::~bign(){}int main() {    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 青少年体力差容易疲劳怎么办 四年级的孩子作业拖拉怎么办 四年级孩子不写作业怎么办 四年级孩子不爱写作业怎么办 四年级的孩子写作业慢怎么办 四年级孩子不想写作业怎么办 四年级孩子写作业特别慢怎么办 6岁儿童睡眠少怎么办 四岁儿童睡眠少怎么办 因睡眠不足第二天没有精神怎么办 睡时间久了头疼怎么办 睡不踏实老醒怎么办 运动过后大腿肌肉酸痛怎么办 牛奶喝多了想吐怎么办 运动过度后吐了怎么办 喝酒后反胃想吐怎么办 拔牙后反胃想吐怎么办 健身完恶心想吐怎么办 锻炼后头晕想吐怎么办 高三学生睡眠不好怎么办 狗狗精力太旺盛怎么办 新入职的同事比你厉害怎么办 银子弹鞋开胶了怎么办 我很笨脑子反应慢怎么办 学车脑子不好使怎么办 生完二胎脑子不好使怎么办 羽毛球鞋买小了怎么办 羽毛球鞋买大了怎么办 感觉自己脑子越来越笨了怎么办? 生完孩子后身体素质差怎么办 胃口太好越来越胖怎么办 心情一紧张心跳手抖怎么办 消防兵新兵连俯卧撑不够怎么办 cf枪王永久禁赛怎么办 换了手机号花呗怎么办 xp系统无限重启怎么办 魔域配置资源读取错误怎么办 魔域异地交易了怎么办 魔域手游宝宝亲密度不够怎么办 魔域手游怎么改密码忘了怎么办 魔域装备注灵怎么办