BigInteger 高精度

来一发高精度模板,感谢光勋的兹次!

const int _bod_=10000;
struct BN{
    static const int N=1010;int a[N];
    BN(){memset(a,0,sizeof(a));}
    int& operator [](int n){return a[n];}
    BN operator =(int n){
         memset(a,0,sizeof(a));
         a[1]=n;if(a[1])a[0]=1;
         while(a[a[0]+1]){a[a[0]+1]=a[a[0]]/_bod_;a[a[0]++]%=_bod_;}
         return *this;
    }
    bool operator <(BN b) const{
        if(a[0]<b[0])return 1;
        if(a[0]>b[0])return 0;
        for(int i=a[0];i>=1;i--){
            if(a[i]>b[i])return 0;
            if(a[i]<b[i])return 1;
        }
        return 0;
    }
    BN operator +(BN b) const{
        b[0]=max(a[0],b[0]);
        for(int i=1;i<=b[0];i++){
            b[i]+=a[i];
            if(b[i]>=_bod_){b[i+1]+=b[i]/_bod_;b[i]%=_bod_;}
        }
        if(b[b[0]+1])b[0]++;
        return b;
    }
    BN operator -(BN b) const{
        BN ans=*this;int q=1;
        if(ans<b)swap(ans,b),q=-1;
        for(int i=1;i<=ans[0];i++){
            ans[i]=ans[i]-b[i];
            if(ans[i]<0){ans[i+1]--;ans[i]+=_bod_;}
        }
        while(ans[0]&&!ans[ans[0]])ans[0]--;
        for(int i=1;i<=ans[0];i++)ans[i]*=q;
        return ans;
    }
    BN operator *(BN b) const{
        BN ans;
        ans[0]=a[0]+b[0]-1;
        for(int i=1;i<=a[0];i++)
            for(int o=1;o<=b[0];o++){
                int now=i+o-1;
                ans[now]+=a[i]*b[o];
            }
        for(int i=1;i<=ans[0];i++)if(ans[i]>=_bod_){ans[i+1]+=ans[i]/_bod_;ans[i]%=_bod_;}
        if(ans[ans[0]+1])ans[0]++;
        return ans;
    }
    void operator +=(BN b){*this=*this+b;}
    void operator -=(BN b){*this=*this-b;}
    void operator *=(BN b){*this=*this*b;}
    void print(){printf("%d",a[a[0]]);for(int i=a[0]-1;i>=1;i--)printf("%.4d",a[i]);}//.xd x=_bod_后导零的个数(位数)
};

  

时间: 2024-11-05 21:02:41

BigInteger 高精度的相关文章

java大数--总结

BigInteger(高精度整数) 1.所在包: java.math.BigInteger 2.大数运算,以下返回类型均为BigInteger BigInteger a; BigInteger b; a.add(b);//大数相加 a.divide(b);//a整除以b a.mod(b);//a对b取余 3.基本类型转化成大数 BigInteger x = BigInteger.valueOf(n); 4.大数求最大公约数 BigInteger a; BigInteger b; a.gcd(b)

Cassandra在CQL语言层面支持多种数据类型

Cassandra在CQL语言层面支持多种数据类型. CQL类型 对应Java类型 描述 ascii String ascii字符串 bigint long 64位整数 blob ByteBuffer/byte[] 二进制数组 boolean boolean 布尔 counter long 计数器,支持原子性的增减,不支持直接赋值 decimal BigDecimal 高精度小数 double double 64位浮点数 float float 32位浮点数 inet InetAddress i

BigInteger类(高精度整型)

位置:java.math.BigInteger 作用:提供高精度整型数据类型及相关操作 一.基本介绍 BigInteger为不可变的任意精度的整数. 所有操作中,都以二进制补码形式表示 BigInteger(同Java 的基本整数类型). 提供所有 Java 的基本整数操作符(* / + -等等)的对应物(一堆函数). 提供 java.lang.Math 的所有相关方法,此外还提供模算术.GCD 计算.质数测试.素数生成.位操作以及一些其他操作. 算术运算.逐位逻辑运算的语义完全模仿 Java

Java小程序之fibonacci数列 BigInteger(高精度整型)

package com.java.learning.recursion; import java.math.*; public class MainClass { public static void main(String args[]){ for(int i = 0; i < 100; i++){ f(i+1); } } public static BigInteger f(long n){ if(n <= 2){ return new BigInteger("1");

BigInteger之高精度乘法

(接上篇http://www.cnblogs.com/daipeiwu/p/4134694.html) 重写* 1 BigInteger operator * (const BigInteger& b){ 2 BigInteger c,d; 3 c.s.clear(); 4 d.s.clear(); 5 int rst; 6 for(int i=0;i<s.size();i++){ 7 for(int j = 0;j<b.s.size();j++){ 8 stringstream ss

HDU 6206 Apple ( 高精度 &amp;&amp; 计算几何 &amp;&amp; 三点构圆求圆心半径 )

题意 : 给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上. 分析 : 简单的计算几何问题,如果能够知道圆心和半径(Radius)以及第四个点和圆心的距离(Distance),我们就能够判断第四个点是否在圆外,例如Distance > Radius则在圆外.三点构圆 的圆心和半径是能够推导出公式的 (参考==> http://blog.csdn.net/dea

04-JAVA高精度数字

为了解决Java基本数据类型在运算时会出现的溢出和计算不精确的问题.Java 提供了两个类BigInteger和BigDecimal,专门用于进行高精度运算.凡是能用int 或float 做的事情,用BigInteger和BigDecimal也可以做,只是必须换用方法调用,而不是使用运算符.高精度整数BigInteger       BigInteger支持任意精度的整数,也就是说我们可精确表示任意大小的整数值:同时在运算过程中不会丢失任何信息:高精度浮点数BigDecimal 它可以表示任意精

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

HDU 3723 Delta Wave (高精度+calelan数)

题意:给定一个图,问你只能向上向下,或者平着走,有多少种方法可以走到最后一个格. 析:首先先考虑,如果没有平的情况就是calelan数了,现在有平的情况,那么就枚举呗,因为数很大,所以要用高精度. 答案应该是sum(C(n, 2*i)*C(n, i)/(i+1)) = a1 + a2 + a3 + ....,然后可以再化简一下,成为一个递推式ai = ai-1 * (n-2*i+1)*(n-2*i+2)/(k*(k+1)): 这次用记事本写的,然后没有测试,直接交的,虽然CE了一发,但还是挺好的