C++大数板子
C++大数板子
使用样例在主函数里看就好,必要的运算符都重载了。
- #include <iostream>
- using namespace std;
- const int maxn=;/*精度位数,自行调整*/
- //1.如果需要控制输出位数的话,在str()里面把len调成需要的位数
- //2.很大的位数是会re的,所以如果是幂运算的话,如 计算x^p的位数n, n=p*log(10)x+1;(注意要加一)
- //3.还可以加上qmul,取模的过程也就是str(),c_str()再搞一次
- class bign{
- friend istream& operator>>(istream&,bign&);
- friend ostream& operator<<(ostream&,const bign&);
- friend bign operator+(const bign&,const bign&);
- friend bign operator+(const bign&,int&);
- friend bign operator*(const bign&,const bign&);
- friend bign operator*(const bign&,int&);
- friend bign operator-(const bign&,const bign&);
- friend bign operator-(const bign&,int&);
- friend bign operator/(const bign&,const bign&);
- friend bign operator/(const bign&,int&);
- friend bign operator%(const bign&,const bign&);
- friend bign operator%(const bign&,int&);
- friend bool operator<(const bign&,const bign&);
- friend bool operator>(const bign&,const bign&);
- friend bool operator<=(const bign&,const bign&);
- friend bool operator>=(const bign&,const bign&);
- friend bool operator==(const bign&,const bign&);
- friend bool operator!=(const bign&,const bign&);
- private://如果想访问len,改成public
- int len,s[maxn];
- public:
- bign(){
- memset(s,,sizeof(s));
- len=;
- }
- bign operator=(const char* num){
- int i=,ol;
- ol=len=strlen(num);
- while(num[i++]==''&&len>)
- len--;
- memset(s,,sizeof(s));
- for(i=; i<len; i++)
- s[i]=num[ol-i-]-'';
- return *this;
- }
- bign operator=(int num){
- char s[maxn];
- sprintf(s,"%d",num);
- *this=s;
- return *this;
- }
- bign(int num){
- *this=num;
- }
- bign(const char* num){
- *this=num;
- }
- string str() const{
- string res="";
- for(int i=; i<len; i++)
- res=char(s[i]+'')+res;
- if(res=="")
- res="";
- return res;
- }
- };
- bool operator<(const bign& a,const bign& b){
- int i;
- if(a.len!=b.len)
- return a.len<b.len;
- for(i=a.len-; i>=; i--)
- if(a.s[i]!=b.s[i])
- return a.s[i]<b.s[i];
- return false;
- }
- bool operator>(const bign& a,const bign& b){
- return b<a;
- }
- bool operator<=(const bign& a,const bign& b){
- return !(a>b);
- }
- bool operator>=(const bign& a,const bign& b){
- return !(a<b);
- }
- bool operator!=(const bign& a,const bign& b){
- return a<b||a>b;
- }
- bool operator==(const bign& a,const bign& b){
- return !(a<b||a>b);
- }
- bign operator+(const bign& a,const bign& b){
- int up=max(a.len,b.len);
- bign sum;
- sum.len=;
- for(int i=,t=;t||i<up; i++)
- {
- if(i<a.len)
- t+=a.s[i];
- if(i<b.len)
- t+=b.s[i];
- sum.s[sum.len++]=t%;
- t/=;
- }
- return sum;
- }
- bign operator+(const bign& a,int& b){
- bign c=b;
- return a+c;
- }
- bign operator*(const bign& a,const bign& b){
- bign res;
- for(int i=; i<a.len; i++)
- {
- for(int j=; j<b.len; j++)
- {
- res.s[i+j]+=(a.s[i]*b.s[j]);
- res.s[i+j+]+=res.s[i+j]/;
- res.s[i+j]%=;
- }
- }
- res.len=a.len+b.len;
- while(res.s[res.len-]==&&res.len>)
- res.len--;
- if(res.s[res.len])
- res.len++;
- return res;
- }
- bign operator*(const bign& a,int& b){
- bign c=b;
- return a*c;
- }
- //只支持大数减小数
- bign operator-(const bign& a,const bign& b){
- bign res;
- int len=a.len;
- for(int i=; i<len; i++)
- {
- res.s[i]+=a.s[i]-b.s[i];
- if(res.s[i]<)
- {
- res.s[i]+=;
- res.s[i+]--;
- }
- }
- while(res.s[len-]==&&len>)
- len--;
- res.len=len;
- return res;
- }
- bign operator-(const bign& a,int& b){
- bign c=b;
- return a-c;
- }
- bign operator/(const bign& a,const bign& b){
- int i,len=a.len;
- bign res,f;
- for(i=len-; i>=; i--)
- {
- f=f*;
- f.s[]=a.s[i];
- while(f>=b)
- {
- f=f-b;
- res.s[i]++;
- }
- }
- while(res.s[len-]==&&len>)
- len--;
- res.len=len;
- return res;
- }
- bign operator/(const bign& a,int& b){
- bign c=b;
- return a/c;
- }
- bign operator%(const bign& a,const bign& b){
- int len=a.len;
- bign f;
- for(int i=len-; i>=; i--)
- {
- f=f*;
- f.s[]=a.s[i];
- while(f>=b)
- f=f-b;
- }
- return f;
- }
- bign operator%(const bign& a,int& b){
- bign c=b;
- return a%c;
- }
- bign& operator+=(bign& a,const bign& b){
- a=a+b;
- return a;
- }
- bign& operator-=(bign& a,const bign& b)
- {
- a=a-b;
- return a;
- }
- bign& operator*=(bign& a,const bign& b){
- a=a*b;
- return a;
- }
- bign& operator/=(bign& a,const bign& b){
- a=a/b;
- return a;
- }
- bign& operator++(bign& a){
- a=a+;
- return a;
- }
- bign& operator++(bign& a,int){
- bign t=a;
- a=a+;
- return t;
- }
- bign& operator--(bign& a){
- a=a-;
- return a;
- }
- bign& operator--(bign& a,int){
- bign t=a;
- a=a-;
- return t;
- }
- istream& operator>>(istream &in,bign& x){
- string s;
- in>>s;
- x=s.c_str();
- return in;
- }
- ostream& operator<<(ostream &out,const bign& x){
- out<<x.str();
- return out;
- }
- int main(){
- bign a;
- bign b;
- cin>>a>>b;
- cout<<a%b<<endl;
- cout<<a-b<<endl;
- return ;
- }
C++大数板子的更多相关文章
- hdu 5666 Segment 俄罗斯乘法或者套大数板子
Segment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- POJ 1737 Connected Graph (大数+递推)
题目链接: http://poj.org/problem?id=1737 题意: 求 \(n\) 个点的无向简单(无重边无自环)连通图的个数.\((n<=50)\) 题解: 这题你甚至能OEIS ...
- 2019 ICPC 银川站
I. Base62(高精度进制转换) 比赛当时雷菊苣和队长俩人拿着大数板子摸了一百多行(然后在缺少大数板子的情况下雷菊苣一发过了orz) 今天补题随便摸了个高精度进制转换的板子交上去就过了还贼短,, ...
- 模拟赛小结:2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)
比赛链接:传送门 两个半小时的时候横扫了铜.银区的所有题,签到成功混进金区.奈何后面没能开出新的题. 最后一个小时的时候xk灵机一动想出了D题的做法,讨论了一波感觉可行,赶紧去敲.结束前2分钟终于过了 ...
- 树的计数 Prüfer编码与Cayley公式 学习笔记
最近学习了Prüfer编码与Cayley公式,这两个强力的工具一般用于解决树的计数问题.现在博主只能学到浅层的内容,只会用不会证明. 推荐博客:https://blog.csdn.net/moreja ...
- Pollard_rho定理 大数的因数个数 这个板子超级快
https://nanti.jisuanke.com/t/A1413 AC代码 #include <cstdio> #include <cstring> #include &l ...
- hdu_1042(模拟大数乘法)
计算n! #include<cstring> #include<cstdio> using namespace std; ]; int main() { int n; whil ...
- [HNOI 2016]大数
Description 题库链接 给你一个长度为 \(n\) ,可含前导零的大数,以及一个质数 \(p\) . \(m\) 次询问,每次询问你一个大数的子区间 \([l,r]\) ,求出子区间中有多少 ...
- ACM-ICPC 2018 焦作赛区网络预赛 J Participate in E-sports(大数开方)
https://nanti.jisuanke.com/t/31719 题意 让你分别判断n或(n-1)*n/2是否是完全平方数 分析 二分高精度开根裸题呀.经典题:bzoj1213 用java套个板子 ...
随机推荐
- 常用模块(datatime)
import datetime,time# dt = datetime.datetime.now() # 获取当前时间的时间对象# dt = datetime.date.fromtimestamp(t ...
- 小红帽安装centos的yum的一些坑!
[root@localhost ~]# lsanaconda-ks.cfg yum-3.4.3-158.el7.centos.noarch.rpm yum-updateonboot-1.1.31-45 ...
- java_链表反转
定义一个Node节点类 1 public class Node { 2 public int value; 3 public Node next; 4 5 public Node(int value) ...
- poj 1840 枚举
Eqs Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13967 Accepted: 6858 Description ...
- kafka+windows+java+springboot中的配置
1.百度kafka+zookeeper+windows配置 1.1 zookeeper配置 dataDir=/tmp/zookeeper # the port at which the client ...
- lua中如何识别C语言中的struct
不如用c写比较简单呢 都要在lua中解析好数据结构,不过也可以用ffi呢...proto.lua
- Scala 基础(1)—— 定义变量 & 定义函数
1. 使用 val & var 定义变量 Scala 中的变量被分为2种:val 和 var.其含义于 Java 中的 final 关键字类似. val 等同于被 final 修饰过的变量, ...
- Spring 对数据库的支持
DAO DAO是用于访问数据的对象,大多数时候,我们将数据保存在数据库中,但这不是唯一选择. 用户也可以将数据保存在数据文件或者LDAP中 DAO屏蔽了数据操作的具体细节 Spring本质上希望能够以 ...
- Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching)
好久没有更新博客了,经历了不少事情,好在最近回归了一点正轨,决定继续Unity Shader的学习之路.作为回归的第一篇,来玩一个比较酷炫的效果(当然废话也比较多),一般称之为GodRay(圣光),也 ...
- 洛谷 P1136 迎接仪式 解题报告
P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出&q ...