C++大数BigInt
前言
一直在用板子,然后考虑到有些细节还不是很清楚,就整理一下吧。然后没有按板子来写,但是思想基本一致,因为我的板子是每四位合并成一位,也就是将大数看做一个100001000010000进制数
构造和输出
大数一位位地输入比较慢,因此一般采用字符串输入,然后将字符串转化为大数
注意需要从后向前存,运算时从前向后运算,输出时从后向前输出
const int maxn=1005;struct BigInt{int a[maxn];int len;BigInt(){ len=1; memset(a,0,sizeof a); }BigInt(char *s){len=strlen(s);int cnt=0;for(int i=len-1;i>=0;i--) a[cnt++]=s[i]-'0';}BigInt(string s){len=s.size();int cnt=0;for(int i=len-1;i>=0;i--) a[cnt++]=s[i]-'0';}BigInt& operator = (const BigInt &T){ //重载赋值运算符,大数之间进行赋值运算len=T.len;memset(a,0,sizeof(a));for(int i=0;i<len;i++)a[i]=T.a[i];return *this;}void println(){for(int i=len-1;i>=0;i--) printf("%d",a[i]);puts("");}void print(){for(int i=len-1;i>=0;i--) printf("%d",a[i]);}
};
逻辑比较
>
bool operator > (const BigInt &T) const {if(len>T.len) return 1;if(len<T.len) return 0;int cur=len-1;while(a[cur]==T.a[cur] && cur>=0) cur--;if(cur>=0 && a[cur]>T.a[cur]) return 1;else return 0;
}
<
bool operator < (const BigInt &T) const {if(len<T.len) return 1;if(len>T.len) return 0;int cur=len-1;while(a[cur]==T.a[cur] && cur>=0) cur--;if(cur>=0 && a[cur]<T.a[cur]) return 1;else return 0;
}
==
bool operator == (const BigInt &T) const {if(len!=T.len) return 0;for(int i=len-1;i>=0;i--)if(a[cur]!=T.a[cur]) return 0;return 1;
}
四则运算
大数加法
实际上就是对每一位相加并处理进位即可
BigInt operator + (const BigInt &T) const {BigInt ret=T;int maxlen=len>T.len?len:T.len; //取长度最长的那个for(int i=0;i<maxlen;i++){ret.a[i]+=a[i];if(ret.a[i]>=10){ret.a[i+1]++;ret.a[i]-=10;}}ret.len=ret.a[maxlen]>0?maxlen+1:maxlen;return ret;
}
大数减法
BigInt operator - (const BigInt &T) const {BigInt t1,t2;bool flag;if(*this>T){ //取得最大数并标记首位是否为负t1=*this,t2=T;flag=0;}else{t1=T,t2=*this;flag=1;}int maxlen=t1.len;for(int i=0;i<maxlen;i++){if(t1.a[i]<t2.a[i]){ //需要向前借位int j=i+1;while(t1.a[i]==0) j++;t1.a[j--]--;while(j>i) t1.a[j--]=9;t1.a[i]+=10-t2.a[i];}else t1.a[i]-=t2.a[i];}while(t1.a[maxlen-1]==0 && t1.len>1){ //看看从最高位开始是否被借位变为0t1.len--;maxlen--;}if(flag) t1.a[maxlen-1]=-t1.a[maxlen-1]; //处理首位的正负return t1;
}
大数乘法
BigInt operator * (const BigInt &T) const {BigInt ret;int i,j,temp1,temp2,up;for(i=0;i<len;i++){up=0;for(j=0;j<T.len;j++){temp1=a[i]*T.a[j]+ret.a[i+j]+up;if(temp1>=10){temp2=temp1-temp1/10*10;up=temp1/10;ret.a[i+j]=temp2;}else{up=0;ret.a[i+j]=temp1;}}if(up) ret.a[i+j]=up; //向最高位的进位是否存在}ret.len=len+T.len;while(ret.a[ret.len-1]==0 && ret.len>1) ret.len--; //处理前导0return ret;
}
大数除法
BigInt operator / (const int &b) const {BigInt ret;int down=0;for(int i=len-1;i>=0;i--){ret.a[i]=(a[i]+down*10)/b;down=a[i]+down*10-ret.a[i]*b;}ret.len=len;while(ret.a[ret.len-1]==0 && ret.len>1) ret.len--;return ret;
}
其他操作
大数取模
以4343%343为例:
然后我们可以发现实际上需要的是对每一位依次取模,并加上来自高位的余数乘以十
int operator % (const int &b) const {int ret=0;for(int i=len-1;i>=0;i--)ret=(ret*10+a[i])%b;return ret;
}
大数求幂
BigInt pow(int n){ //传入的n非负BigInt x=*this,ret("1");while(n) {if(n&1) ret=ret*x;x=x*x;n>>=1;}return ret;
}
C++大数BigInt相关推荐
- HDU 4927 大数运算
模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...
- ACdream 1210 Chinese Girls' Amusement
题目链接:http://115.28.76.232/problem?pid=1210 Problem Description You must have heard that the Chinese ...
- Bigint Multiplication:大数乘法(hihoCoder C++)
Bigint Multiplication 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given 2 nonnegative integers a and b, c ...
- 从数据类型 nvarchar 转换为 bigint 时出错_JavaScript数据类型的一些细节点
▲ 点击上方蓝字关注我 ▲文 / 景朝霞来源公号 / 朝霞的光影笔记ID / zhaoxiajingjing图 / 自己画 目录JS数据类型的一些细节点0 / JS 中的数据类型的一些细节点(1)JS ...
- C++ BigInt模板手打
参考邝斌的模板 模拟整数,大整数对象的数据成员应该有两个 1:存放数字的数组,(常用字符类型存放1位数字,这里用int类型存放4位数字(当然也可以8位,不过参数需要用longlong才能保证乘法不超过 ...
- ACM JAVA大数
有的水题自己模拟下大数就过了,有的各种坑,天知道曾经因为大数wa了多少次....自己最近学者用JAVA,下面是自己总结的JAVA常用知识.. 框架 import java.util.Scanner; ...
- 面试题整理3 大数的表示及加减法问题
在<剑指offer>面试题12中指出大数的表示时一般用字符串,用一个char型字符表示十进制数的一位.但是一个char类型最多能够表示256个字符,而十进制数只有0~9的10个数字,这样造 ...
- javascript json_JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案
JavaScript 精度的问题时不时就会出现在前端开发面前,这里讨论的是大数精度丢失的问题 问题复现 前端向服务端请求某个订单数据,其中订单号 18 位,在数据库中以数字的形式保存,服务端查询数据库 ...
- C++实现大数加减法
本代码可以获取命令行输入的数字和加减运算 因为较大整数的相加很可能超出整型的32位限制,或者本身就是超出限制的大数之间的加减运算. 所以我们需要单独写一个能大数相加减的函数 基本原理:把数字用字符串的 ...
最新文章
- 出身寒门,如何改变命运?
- c语言链表拆分,C语言拆分链表程序
- Filter学习(一)
- 数据网络卡顿怎么处理_监控网络卡顿怎么办
- 上拉加载 php,php+jquery 上拉加载
- 《防患未然:实施情报先导的信息安全方法与实践》——2.8 小结
- setitimer 创建两个定时器_UE4 Timer(定时器)相关源码分析
- 虚拟服务器 端口管理,Apache服务配置虚拟主机(基于域名、端口、IP地址)与简单访问权限管理...
- UIButton的创建与释放问题
- oracle 清除数据库缓存
- java web部署文档_javaweb项目实施部署文档
- logisim基础(非常基础)----寄存器元件的使用
- Ubuntu彻底卸载MySQL
- aforge 相机标定_在C#和WPF中使用Aforge.NET获取网络摄像头流
- 三种教鞭工具使用对比
- html格式蠕虫病毒,XiaoBa自制蠕虫病毒[2018-1-10]
- 友盟 android版本统计,友盟统计下载_友盟统计安卓版下载_友盟统计手机版下载_友盟统计app_易玩网...
- linux文件夹建立软连接,软连接 - Linux软连接创建及一个“坑”
- 软考高级 真题 2015年下半年 信息系统项目管理师 综合知识
- 华为云在Linux ECS上使用obsutil通过内网访问OBS