首页 > 其他分享 >高精度板子

高精度板子

时间:2023-05-02 11:44:05浏览次数:44  
标签:const 高精度 int wint 板子 operator return size

百度百科>

 

#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct wint:vector<int>
{
    wint(int n=0)
    {
        push_back(n);
        check();
    }
    wint& check()//
    {
        while(!empty()&&!back())pop_back();
        if(empty())return *this;
        for(int i=1; i<size(); ++i)
        {
            (*this)[i]+=(*this)[i-1]/10;
            (*this)[i-1]%=10;
        }
        while(back()>=10)
        {
            push_back(back()/10);
            (*this)[size()-2]%=10;
        }
        return *this;//
    }
};

istream& operator>>(istream &is,wint &n)
{
    string s;
    is>>s;
    n.clear();
    for(int i=s.size()-1; i>=0; --i)n.push_back(s[i]-'0');
    return is;
}
ostream& operator<<(ostream &os,const wint &n)
{
    if(n.empty())os<<0;
    for(int i=n.size()-1; i>=0; --i)os<<n[i];
    return os;
}

//常量引用当参数,避免拷贝更高效
bool operator!=(const wint &a,const wint &b)
{
    if(a.size()!=b.size())return 1;
    for(int i=a.size()-1; i>=0; --i)
        if(a[i]!=b[i])return 1;
    return 0;
}
bool operator==(const wint &a,const wint &b)
{
    return !(a!=b);
}
bool operator<(const wint &a,const wint &b)
{
    if(a.size()!=b.size())return a.size()<b.size();
    for(int i=a.size()-1; i>=0; --i)
        if(a[i]!=b[i])return a[i]<b[i];
    return 0;
}
bool operator>(const wint &a,const wint &b)
{
    return b<a;
}
bool operator<=(const wint &a,const wint &b)
{
    return !(a>b);
}
bool operator>=(const wint &a,const wint &b)
{
    return !(a<b);
}

wint& operator+=(wint &a,const wint &b)
{
    if(a.size()<b.size())a.resize(b.size());
    for(int i=0; i!=b.size(); ++i)a[i]+=b[i];
    return a.check();
}
wint operator+(wint a,const wint &b)
{
    return a+=b;
}

wint& operator-=(wint &a,wint b)
{
    if(a<b)swap(a,b);
    for(int i=0; i!=b.size(); a[i]-=b[i],++i)
        if(a[i]<b[i])//需要借位
        {
            int j=i+1;
            while(!a[j])++j;
            while(j>i)
            {
                --a[j];
                a[--j]+=10;
            }
        }
    return a.check();
}
wint operator-(wint a,const wint &b)
{
    return a-=b;
}

wint operator*(const wint &a,const wint &b)
{
    wint n;
    n.assign(a.size()+b.size()-1,0);
    for(int i=0; i!=a.size(); ++i)
        for(int j=0; j!=b.size(); ++j)
            n[i+j]+=a[i]*b[j];
    return n.check();
}
wint& operator*=(wint &a,const wint &b)
{
    return a=a*b;
}

wint divmod(wint &a,const wint &b)
{
    wint ans;
    for(int t=a.size()-b.size(); a>=b; --t)
    {
        wint d;
        d.assign(t+1,0);
        d.back()=1;
        wint c=b*d;
        while(a>=c)
        {
            a-=c;
            ans+=d;
        }
    }
    return ans;
}
wint operator/(wint a,const wint &b)
{
    return divmod(a,b);
}
wint& operator/=(wint &a,const wint &b)
{
    return a=a/b;
}
wint& operator%=(wint &a,const wint &b)
{
    divmod(a,b);
    return a;
}
wint operator%(wint a,const wint &b)
{
    return a%=b;
}

wint pow(const wint &n,const wint &k)
{
    if(k.empty())return 1;
    if(k==2)return n*n;
    if(k.front()%2)return n*pow(n,k-1);
    return pow(pow(n,k/2),2);
}

int main()
{
    wint a,b;
    
    cin>>a>>b;
    cout<<(a<b)<<endl
        <<(a==b)<<endl
        <<a+b<<endl
        <<a-b<<endl
        <<a*b<<endl
        <<a/b<<endl
        <<a%b<<endl
        <<pow(a,b);
}

 

标签:const,高精度,int,wint,板子,operator,return,size
From: https://www.cnblogs.com/towboa/p/17367501.html

相关文章

  • 高精度
    高精度减法#include<bits/stdc++.h>usingnamespacestd;boolcmp(vector<int>a,vector<int>b){if(a.size()!=b.size())returna.size()>b.size();for(inti=a.size()-1;i>=0;--i)if(a[i]!=b[i])retu......
  • 高精度乘多位低精度
    【题目描述】输入高精度数字a,再输入多位低精度数字b,计算a*b的乘积。【输入】略【输出】略#include<iostream>#include<cstring>usingnamespacestd;intmain(){chara[201];inta2[201]={},n,c[402]={};cin>>a>>n;intlena=......
  • 换根 DP 板子
    以前一直以为这玩意是随机应变的。结果还真能总结出板子。当然也有一定的局限性,比如\(dp\)值必须\(O(1)\)算。但不影响正常使用。ins:向\(k\)的子树信息中插入/删除\(nx\)的子树信息。这里的子树在dfs1中是指以\(1\)为根的子树;dfs2中是指以\(k\)为根。recalc......
  • 高精度数相加乘一位数
    【问题描述】请编程实现,输入两个高精度数,输出它们的和的n倍。(1<=n<=9),注意:这两个高精度数的位数不一定相同且有可能产生进位。【输入输出描述】输入: 两行,第一行为高精度数a,第二行为高精度数b。输出: 一行,一个高精度数c,表示a与b的和的n倍。【样例......
  • 高精度乘一位整数
    求高精度数的n倍【问题描述】定义一个高精度数a,输出a的n(0<=n<=9)倍的值。a的长度不超过200.【输入输出描述】输入:两行,第一行为高精度数a,第二行为倍数n;输出:a的n倍的值【样例输入】122344445556667773【样例输出】36703333667000331#include<iost......
  • 高精度四则及GCD运算(二元均是高精度)
    原代码出处,转自HDAWN,经过部分改写,包装为结构体,常数比较大.测试输出大概实际操作具体支持四则运算及GCD运算,重写了istream和ostream和比较运算符.构造函数既可以longlong,string,也可以char[]如果除法要求余数,a/b=c,a-b*c=res,除了这样绕一......
  • 高精度模板 大数减大数 可变数组vector实现
    vector<int>Sub(vector<int>&A,vector<int>&B)//这里默认长数减去短数{vector<int>C;//结果向量intT=0;//上一位借位标志位for(inti=0;i<A.size();i++){T=A[i]-T;if(i<B.size())T-=B[i];//检......
  • 高精度模板 整数大数除以小整数数
    vector<int>Div(vector<int>&A,int&B){vector<int>C;intT=0;//除数for(inti=A.size()-1;i>=0;i--)//注意,除法模拟是从最高位开始的{T=T*10+A[i];//更新除数C.push_back(T/B);T%=B;......
  • c如何输出高精度浮点型数
    环境:cygwin64的gcc (mingw64的gcc不行)intmain(intargc,charconst*argv[]){longdoubleld=1.23L;printf("1%Lf\n",ld);doubled=1.3456789123;printf("2%f\n",d);printf("3%lf\n",d);printf("4%ll......
  • Java中处理高精度数据计算
    1、为什么要使用高精度计算拿整数举例:在Java中,int和long是两种基本数据类型,而BigInteger是一个对象类型。它们的取值范围如下:-int:32位有符号整数,取值范围为-2^31~2^31-1(即-2147483648~2147483647)。-long:64位有符号整数,取值范围为-2^63~2^63-1(即-9223......