`
Coco_young
  • 浏览: 127628 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

大数模板

 
阅读更多

该模板来自于吉林大学ACM模板库


#include<iostream>
using namespace std;
const int base = 10000;
const int width = 4;
const int N = 1000;
struct bint{
    int ln,v[N];
    bint(int r=0){
        for(ln = 0;r>0;r/=base)v[ln++] = r%base;
    }
    bint operator = (const bint &r){
        memcpy(this,&r,(r.ln+1)*sizeof(int));
        return *this;
    }
};
bool operator < (const bint &a,const bint &b){
    int i;
    if(a.ln!=b.ln)return a.ln<b.ln;
    for(i=a.ln-1;i>=0&&a.v[i]==b.v[i];i--);
    return i<0?0:a.v[i]<b.v[i];
}
bool operator <= (const bint& a,const bint& b){
    return !(b<a);
}
bint operator + (const bint &a, const bint &b){
    bint res;int i,cy=0;
    for(i=0;i<a.ln||i<b.ln||cy>0;i++){
        if(i<a.ln)cy+=a.v[i];
        if(i<b.ln)cy+=b.v[i];
        res.v[i] = cy%base; cy/=base;
    }
    res.ln = i;
    return res;
}
bint operator - (const bint &a,const bint &b){
    bint res;int i,cy=0;
    for(res.ln=a.ln,i=0;i<res.ln;i++){
        res.v[i] = a.v[i]-cy;
        if(i<b.ln)res.v[i]-=b.v[i];
        if(res.v[i]<0)cy=1,res.v[i]+=base;
        else cy = 0;
    }
    while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;
    return res;
}
bint operator * (const bint &a,const bint &b){
    bint res;res.ln = 0;
    if(0==b.ln){res.v[0]=0;return res;}
    int i,j,cy;
    for(i=0;i<a.ln;i++){
        for(j=cy=0;j<b.ln||cy>0;j++,cy/=base){
            if(j<b.ln)cy+=a.v[i]*b.v[j];
            if(i+j<res.ln)cy+=res.v[i+j];
            if(i+j>=res.ln)res.v[res.ln++] = cy%base;
            else res.v[i+j] = cy%base;
        }
    }
    return res;
}
bint operator / (const bint &a,const bint &b){
    bint tmp,mod,res;
    int i,lf,rg,mid;
    mod.v[0] = mod.ln = 0;
    for(i=a.ln-1;i>=0;i--){
        mod = mod*base+a.v[i];
        for(lf=0,rg=base-1;lf<rg;){
            mid = (lf+rg+1)/2;
            if(b*mid<=mod)lf=mid;
            else rg = mid-1;
        }
        res.v[i] = lf;
        mod = mod-b*lf;
    }
    res.ln = a.ln;
    while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;
    return res;
}
bint operator % (const bint &a,const bint &b){
    bint tmp,mod,res;
    int i,lf,rg,mid;
    mod.v[0] = mod.ln = 0;
    for(i=a.ln-1;i>=0;i--){
        mod = mod*base+a.v[i];
        for(lf=0,rg=base-1;lf<rg;){
            mid = (lf+rg+1)/2;
            if(b*mid<=mod)lf=mid;
            else rg = mid-1;
        }
        res.v[i] = lf;
        mod = mod-b*lf;
    }
    res.ln = a.ln;
    while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;
    return mod;
}
int digits(bint &a){
    if(a.ln==0)return 0;
    int l = (a.ln-1)*4;
    for(int t=a.v[a.ln-1];t;++l,t/=10);
    return l;
}
bool read(bint &b,char buf[]){
    if(1!=scanf("%s",buf))return 0;
    int w,u,ln = strlen(buf);
    memset(&b,0,sizeof(bint));
    if('0'==buf[0]&&0==buf[1])return 1;
    for(w=1,u=0;ln;){
        u += (buf[--ln]-'0')*w;
        if(w*10==base){
            b.v[b.ln++] = u;
            u = 0;
            w = 1;
        }else{
            w *=10;
        }
    }
    if(w!=1)b.v[b.ln++]=u;
    return 1;
}
void write(const bint &v){
    int i;
    printf("%d",v.ln==0?0:v.v[v.ln-1]);
    for(i=v.ln-2;i>=0;i--){
        printf("%04d",v.v[i]);
    }
    printf("\n");
}
int main(){
    bint a,b,c;char buf[100];
    read(a,buf);b=a-1;
    write((a%b));
    return 0;
}


分享到:
评论

相关推荐

    c++大数模板

    c++大数模板 内含各种大数操作 还可以自己设置数的长度

    大数模板C++版 可直接套用

    本篇将详细解析标题为“大数模板C++版 可直接套用”的知识点,以及如何运用这个模板。 首先,大数模板的核心在于存储和表示大数。由于C++的内置类型无法满足需求,我们通常使用字符数组或向量来存储大数的每一位。...

    C++高精度大数模板

    本篇将围绕标题“C++高精度大数模板”展开,详细介绍两种不同的大数模板实现:一种简便,另一种详细。 首先,我们来看“高精度(简略版)”。这个模板可能采取了最基本的策略来实现大数,即通过数组存储多位数字,...

    大数模板(C++)大数加法、大数乘法、大数除法

    用C++写的重载的大数模板 大数加法、大数乘法、大数除法、大数减法 带有注释

    c++大数模板,加减乘除阶乘求幂N进制

    以上就是关于"C++大数模板,加减乘除阶乘求幂N进制"的相关知识点。这些操作在密码学、分布式计算、金融计算等领域都有广泛应用。通过理解并掌握这些知识点,开发者可以编写高效且灵活的大数处理程序。

    C++大数模板。ACM必备

    处理大数的模板,C++大数模板。ACM必备

    java大数模板

    还在为ACM的大数高精度困扰吗?赶快用java的大数类吧!

    ACM大数模板(c/c++)

    ACM中的常用高精度模板,内容:大数加法,大数乘小数,大数乘大数,大数除法。

    最全的大数模板,告别高大上

    使用最通俗的语言写的高精度模板,适合初学者,效率不低。

    大数运算模板(C++)

    四则运算的正确实现是大数模板成功的关键,需要处理进位、借位等操作,确保运算结果的准确无误。 平方根的计算在很多实际应用场景中都十分重要,比如在科学计算和数据分析中。该模板提供了计算大数平方根的功能,这...

    java 处理大数模板

    这个模板将详细介绍如何在Java中使用`BigInteger`来解决大数问题。 `BigInteger`是Java的标准库`java.math`包中的一个类,专门用于处理任意精度的整数。它可以表示任何大小的数字,不受32位或64位计算机硬件限制。...

    C++大数模板(推荐)

    C++大数模板是用于处理超出普通整型变量范围的大整数的一种编程技巧。在C++中,标准库并未提供内置的大数类型,因此需要自定义数据结构和运算方法来实现大数运算。本篇文章主要介绍了如何使用C++通过运算符重载来...

    ACM大数模版ACM大数模版

    本文将详细讲解ACM大数模版中的三个主要操作:大数加法、大数减法和大数乘法。 **大数加法** 大数加法的实现通常基于字符串表示的大整数进行。以下是一个简单的C语言实现: ```c void add(char* a, char* b, char...

    C++大数模板

    大数的加减乘除,C++,C语言

    ACM大数常见处理模板

    大数处理主要涉及到数学、算法和编程技巧,对于参赛者来说,掌握一些常用的大数处理模板能够显著提高解题效率。以下是一些关于大数处理的关键知识点: 1. **大数表示**:在编程中,我们通常使用字符串来存储大数,...

    ACM数学模板

    - 高精度:用于处理超出标准数据类型范围的整数运算,包括一般大数模板和完全大数模板。 - JavaBigInteger:利用Java提供的BigInteger类来处理大数。 - JavaBigDecimal:利用Java提供的BigDecimal类来处理高精度...

    acm代码模板

    ##### 3.5 大数模板示例代码 下面是一个简单的大数加法模板示例: ```cpp #include #include #include using namespace std; class BigNum { public: vector&lt;int&gt; num; BigNum operator+(const BigNum &b)...

    ACM 算法模板集

    大数模板,字符读入 四. 数论算法 1. Greatest Common Divisor最大公约数 2. Prime素数判断 3. Sieve Prime素数筛法 4. Module Inverse模逆元 5. Extended Euclid扩展欧几里德算法 6. Modular Linear Equation模...

    上海交通大学ACM算法模板

    **三、大数模板和字符读入** 在处理大数计算时,模板通常会提供大数运算的实现,包括加减乘除、模运算等。同时,对于输入的处理,模板可能会包含快速读取字符或字符串的技巧,以提高程序运行效率。 **四、数论算法...

Global site tag (gtag.js) - Google Analytics