C++大数模板

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <string.h>
using namespace std;
const int MAXN=10005;
const int BASE=100000;
const int LEN=5;//防止int溢出,最多基数最多设为5位
int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
struct BigInt{
public:
    int e[MAXN];
    int len;
    BigInt()
    {
        memset(e,0,sizeof(e));
        len=0;
    }
    void set(int x)
    {
        while(x>0)
        {
            e[len++]=x%BASE;
            x/=BASE;
        }
    }
    bool operator>(const BigInt &b)
    {
        if(len>b.len)
        {
            return true;
        }
        else if(len==b.len)
        {
            int i;
            for(i=len-1;i>=0;i--)
            {
                if(e[i]>b.e[i])    return true;
                else if(e[i]<b.e[i])    return false;
                else ;
            }
            return false;
        }
        else
        {
            return false;
        }
    }
    BigInt operator+(const BigInt &b)
    {
        BigInt res;
        res.len=max(len,b.len);
        int up=0;
        for(int i=0;i<res.len;i++)
        {
            int z=e[i]+b.e[i];
            res.e[i]=z%BASE;
            up=z/BASE;
        }
        if(up!=0)    res.e[res.len++]=up;
        return res;
    }
    BigInt operator-(const BigInt &b)
    {
        BigInt res;
        res.len=max(len,b.len);
        int down=0;
        for(int i=0;i<res.len;i++)
        {
            int z=e[i]-b.e[i]-down;
            if(z<0)
            {
                z+=BASE;
                down=1;
            }
            else
            {
                down=0;
            }
            res.e[i]=z;
        }
        while(res.len>1&&res.e[res.len-1]==0)    res.len--;
        return res;
    }
    BigInt operator*(const BigInt &b)
    {
        BigInt res;
        for(int i=0;i<len;i++)
        {
            int up=0;
            for(int j=0;j<b.len;j++)
            {
                int z=(e[i]*b.e[j]+res.e[i+j]+up);
                res.e[i+j]=z%BASE;
                up=z/BASE;
            }
            if(up!=0)    res.e[i+b.len]=up;
        }
        res.len=len+b.len;
        while(res.len>1&&res.e[res.len-1]==0)    res.len--;
        return res;
    }
    BigInt operator/(const int &b)
    {
        BigInt res=*this;
        int carry=0;
        for(int i=len-1;i>=0;i--)
        {
            res.e[i]+=carry*BASE;
            carry=res.e[i]%b;
            res.e[i]/=b;
        }
        while(res.len>1&&res.e[res.len-1]==0)    res.len--;
        return res;
    }
    BigInt operator%(const int &b)
    {
        BigInt tmp=*this;
        BigInt B;
        B.set(b);
        BigInt res=tmp-(tmp/b)*B;
        return res;
    }
    friend ostream &operator<<(ostream &out,const BigInt &res)
    {
        out<<res.e[res.len-1];
        for(int i=res.len-2;i>=0;i--)
        {
            out<<setw(LEN)<<setfill(‘0‘)<<res.e[i];
        }
        out<<endl;
        return out;
    }
};
int main()
{
    BigInt res;
    res.set(1092);
    res=res%1091;
    cout<<res;
    return 0;
}
时间: 2024-10-20 23:51:50

C++大数模板的相关文章

timus 1547. Password Search【题意思路+大数模板】

题目地址传送门:URAL 1547 这道题需要用到大数的很多模板,推荐大家去刷刷! 题目大意:Vova忘记了在Timus OJ上面的密码了,密码是由小写字母(a~z)组成的,他只知道密码长度不大于n位,现在他需要用m台数据处理器对密码进行检索,其中检索顺序需要满足字典序.比如他的密码长度不大于2,那就需要依次检索a,b,..........,y,z,aa,ab,..........,zy,zz.输出每台数据检索器的检索区间,使得总的检索效率可以达到最高. 已知密码的总可能数不少于数据处理器个数.

ACM大数模板(支持正负整数)

之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多. 实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验. 话不多说,贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 5 #define MAXBIT 1007

大数模板 poj3982

1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就好了,可是假设不能独立写出来的话,不相当于白搭吗.所以我学完c++后会手写出模板的!. 注意,这个大数模板仅仅适用于不太大的模拟,几万位,肯定会爆内存的,兴许会补上功能更强大的模板和JAVA大数模板. #include<iostream> #include<cstdio> #inclu

大数模板

1 #include<stdio.h> 2 #include<string.h> 3 #include<conio.h> 4 #include<stdlib.h> 5 #include<time.h> 6 #define N 10000 7 // 大数模板... 8 class BigNum 9 { 10 public: 11 int s[N]; //存放各位数字,s[0]为符号位,1代表正数,-1代表负数 12 //数组内高位存高位,123存在

简单大数模板(+ - )--待完善

水了ural的dp专题前三道1009,1012,1013,都是同一个问题,只是数据规模变大了. 题意大概是这样的:求一个k进制的n位数字,满足不含前导0和不含连续两个0的个数有多少个. dp[i][0]表示第i位为0有多少个满足条件,dp[i][1]表示i位不为0满足条件的个数,则结果就是dp[n][1]; 递推关系如下: dp[i][0]=dp[i-1][1]; dp[i][1]=(dp[i-1][0]+dp[i-1][1])*k; 顺便贴上简单的大数类 1 #include<iostream

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 例子1 例子输入1[复制] 5 例子输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=

bignum 大数模板

今天无意间看到一个很好的大数模板,能算加.减.乘.除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减.我借用了一下:(作过少许代码上的精简) 1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 #include<iostream> 6 using

Hdu 4762 网络赛 高精度大数模板+概率

注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放,所以最后的概率为n/m^(n-1),最后通过大数模板搞定该题的化简. C++代码 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<iomanip> 5 #include

大数模板 (C ++)

上次BC遇到一个大数题目,没有大数模板和不会使用JAVA的同学们GG了,赛后从队友哪里骗出大数模板.2333333,真的炒鸡nice(就是有点长),贴出来分享一下好辣. 1 //可以处理字符串前导零 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <stack&g