C++实现大正整数及其相关运算(长期更新)
/**
只考虑正数[1, +∞);
“-”运算只允许大数减小数;
小端存储;
*/
typedef struct BigInteger0 {
vector<int> v;
BigInteger0(int len) {
v.resize(len);
}
BigInteger0(const vector<int>& nv) {
v.assign(nv.begin(), nv.end());
}
BigInteger0(const char str[]) {
int len = strlen(str);
v.resize(len);
; i < len; ++i)
v[len - - i] = str[i] - ';
}
BigInteger0 operator + (const BigInteger0& obj) const {
BigInteger0 res(v);
int len = max(v.size(), obj.v.size());
res.v.resize(len + );
; i < len; ++i) {
if(i < obj.v.size())res.v[i] += obj.v[i];
) {
res.v[i + ] += res.v[i] / ;
res.v[i] %= ;
}
}
] == )res.v.resize(res.v.size() - );
return res;
}
/*默认v > obj,即v.size() > obj.v.size()*/
BigInteger0 operator - (const BigInteger0& obj) const {
BigInteger0 res(v);
; i < v.size(); ++i) {
if(i < obj.v.size())res.v[i] -= obj.v[i];
) {
res.v[i + ]--;
res.v[i] += ;
}
}
int len = res.v.size();
] == ; --len);
res.v.resize(len);
return res;
}
BigInteger0 operator * (const BigInteger0& obj) const {
BigInteger0 res(v.size() + obj.v.size());
, len1 = v.size(); i < len1; ++i) {
, len2 = obj.v.size(); j < len2; ++j) {
res.v[i + j] += v[i] * obj.v[j];
) {
res.v[i + j + ] += res.v[i + j] / ;
res.v[i + j] %= ;
}
}
}
int len = res.v.size();
] == ; --len);
res.v.resize(len);
return res;
}
BigInteger0 operator / (BigInteger0& obj) const {
");
");
else {
BigInteger0 res("), tmp(v);
while(tmp > obj) {
int lendif = tmp.v.size() - obj.v.size();
BigInteger0 b1 = ten ^ lendif;
BigInteger0 b2 = b1 * obj;
if(tmp < b2) {
b1 = ten ^ (lendif - );
b2 = b1 * obj;
}
while(tmp >= b2) {
tmp = tmp - b2;
res = res + b1;
}
}
return res;
}
}
/**power*/
BigInteger0 operator ^ (int n) const {
BigInteger0 res("), tmp(v);
; n >>= ) {
)res = res * tmp;
tmp = tmp * tmp;
}
return res;
}
BigInteger0 sqrt() {
) / ;
BigInteger0 res(len), ten(");
; i >= ; --i) {
, high = , mid, bit;
) {
mid = (low + high) >> ;
BigInteger0 b = res + (BigInteger0(vector<, mid)) * (ten ^ i));
if(b * b <= *this) {
low = mid;
bit = mid;
}
else high = mid;
}
res.v[i] = bit;
}
] == ; --len);
res.v.resize(len);
return res;
}
bool operator < (const BigInteger0& obj) const {
if(v.size() < obj.v.size())return true;
else if(v.size() > obj.v.size())return false;
else {
;
&& v[i] == obj.v[i]; --i);
)return false;
else return v[i] < obj.v[i];
}
}
bool operator > (const BigInteger0& obj) const {
return obj < *this;
}
bool operator == (const BigInteger0& obj) const {
if(v.size() != obj.v.size())return false;
else {
; i < v.size(); ++i) {
if(v[i] != obj.v[i])return false;
}
return true;
}
}
bool operator >= (const BigInteger0& obj) const {
return *this > obj || *this == obj;
}
bool operator <= (const BigInteger0& obj) const {
return *this < obj || *this == obj;
}
string value() {
string res;
; i >= ; --i)res.push_back(v[i] + ');
)res.push_back(');
return res;
}
} BigInteger;
V2.0
/**
只考虑正数[1, +∞);
“-”运算只允许大数减小数;
小端存储;
*/
typedef struct BigInteger0 {
typedef long long LL;
, BOUND = int(1e9);
vector<LL> v;
void trim() {
;
&& v[i] == ; --i);
)v.resize(i + );
}
string value() {
];
string res;
trim();
)res.push_back(');
else {
; i >= ; --i) {
)sprintf(tmp, "%I64d", v[i]);
else sprintf(tmp, "%09I64d", v[i]);
res += string(tmp);
}
}
return res;
}
bool isEven(){
] % == ;
}
BigInteger0(const vector<LL>& nv): v(nv) {}
BigInteger0(int len) {
v.resize(len);
}
BigInteger0(const char str[]) {
int len = strlen(str);
, cnt = , last = len;
v.resize(cap);
, len - BIT); i >= ; i = max(, i - BIT)) {
LL tmp = ;
for(int j = i; j < last; ++j) {
tmp = tmp * + str[j] - ';
}
v[cnt++] = tmp;
last = i;
)break;
}
trim();
}
BigInteger0 operator + (const BigInteger0& obj) const {
BigInteger0 res(v);
int len = max(v.size(), obj.v.size());
res.v.resize(len + );
; i < len; ++i) {
if(i < obj.v.size())res.v[i] += obj.v[i];
if(res.v[i] >= BOUND) {
res.v[i + ] += res.v[i] / BOUND;
res.v[i] %= BOUND;
}
}
res.trim();
return res;
}
/*默认v >= obj,即v.size() >= obj.v.size()*/
BigInteger0 operator - (const BigInteger0& obj) const {
BigInteger0 res(v);
; i < v.size(); ++i) {
if(i < obj.v.size())res.v[i] -= obj.v[i];
) {
res.v[i + ]--;
res.v[i] += BOUND;
}
}
res.trim();
return res;
}
BigInteger0 operator * (const BigInteger0& obj) const {
BigInteger0 res(v.size() + obj.v.size());
, len1 = v.size(); i < len1; ++i) {
, len2 = obj.v.size(); j < len2; ++j) {
res.v[i + j] += v[i] * obj.v[j];
if(res.v[i + j] >= BOUND) {
res.v[i + j + ] += res.v[i + j] / BOUND;
res.v[i + j] %= BOUND;
}
}
}
res.trim();
return res;
}
BigInteger0 divide(const BigInteger0& obj, BigInteger0& reminder){
BigInteger0 zero(");
if(*this < obj){reminder = *this; return zero;}
else if(*this == obj){reminder = zero; return one;}
else{
BigInteger0 tmp(v), p1 = one, p2 = one, res = zero;
while(tmp >= obj){
p1 = one;
while(p1 * obj <= tmp){
p2 = p1;
p1 = p1 * two;
}
res = res + p2;
tmp = tmp - (obj * p2);
}
reminder = tmp;
return res;
}
}
BigInteger0 operator / (const BigInteger0& obj){
BigInteger0 rem(");
return this->divide(obj, rem);
}
BigInteger0 operator % (const BigInteger0& obj){
BigInteger0 rem(");
this->divide(obj, rem);
return rem;
}
/**power*/
BigInteger0 operator ^ (BigInteger0 n) const {
BigInteger0 zero(");
BigInteger0 res("), tmp(v);
for(; n > zero; n = n / two) {
if(!n.isEven())res = res * tmp;
tmp = tmp * tmp;
}
return res;
}
bool operator < (const BigInteger0& obj) const {
if(v.size() < obj.v.size())return true;
else if(v.size() > obj.v.size())return false;
else {
;
&& v[i] == obj.v[i]; --i);
)return false;
else return v[i] < obj.v[i];
}
}
bool operator > (const BigInteger0& obj) const {
return obj < *this;
}
bool operator == (const BigInteger0& obj) const {
if(v.size() != obj.v.size())return false;
else {
; i < v.size(); ++i) {
if(v[i] != obj.v[i])return false;
}
return true;
}
}
bool operator >= (const BigInteger0& obj) const {
return *this > obj || *this == obj;
}
bool operator <= (const BigInteger0& obj) const {
return *this < obj || *this == obj;
}
BigInteger0& operator = (const BigInteger0& obj) {
v.assign(obj.v.begin(), obj.v.end());
return *this;
}
} BigInteger;
C++实现大正整数及其相关运算(长期更新)的更多相关文章
- js 时间函数 及相关运算大全
js 时间函数 及相关运算大全 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); ...
- Problem B: 大整数的加法运算
Problem B: 大整数的加法运算 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 112 Solved: 57[Submit][Status][W ...
- 大整数加减运算的C语言实现
目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...
- Python 整数和浮点数运算
和数学运算不同的地方是,Python的整数运算结果仍然是整数,浮点数运算结果仍然是浮点数:1 + 2 # ==> 整数 31.0 + 2.0 # ==> 浮点数 3.0 整数和浮点数混合运 ...
- Python:Base1(数据类型,print语句,变量,定义字符串,raw字符串与多行字符串,Unicode字符串,整数和浮点数运算,布尔类型运算)
1.Python中数据类型: 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据 ...
- Java代码优化(长期更新)
前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...
- iOS-工作经验+资料分享(长期更新)
在此记录工作中的一些经验和技术资料 长期更新 欢迎各位业内朋友指正.交流技术上的问题 0.苹果开发联盟电话 4006 701855 1.轻易不用使用tableViewController,因为改变他自 ...
- Ubuntu16.04系统美化、常用软件安装等,长期更新
Ubuntu16.04系统美化.常用软件安装等,长期更新 IT之家啊 18-09-0915:00 因为我个人偏向于玩VPS.服务器之类的东西,所以一般我都是用CentOS.不过对于桌面版的Linux, ...
- Spring MVC & Boot & Cloud 技术教程汇总(长期更新)
昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ ...
随机推荐
- redis事务和脚本
事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况. redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间.multi代表事务开 ...
- Spring之核心容器bean
摘要:Spring的核心容器实现了Ioc,其目 的是提供一种无侵入式的框架.在本文中,首先讲解了Spring的基础bean的相关知识,然后介绍了Spring是如何对bean进行管理的. 在Spring ...
- rspec-rails中的一些匹配器只有在特定的类型才能使用。
请求测试 ) expect(response).not_to have_http_status(:created) Model Specs描述模型的行为,一般基于数据库. Request Spec 主 ...
- phpstorm 2017版代码提示功能开启解决方案
安装好phpstorm 2017之后 发现代码高亮和函数自动提示都失效了 在phpstorm底部面板的信息提示处发现有一条系统消息: 12:04:18 Power save mode is on Co ...
- 微信小程序封装storage(含错误处理)
这次给你们安利的是微信小程序封装storage,先说下微信官方的 wx.getStorage({ key:"", success: function (res) { }, fail ...
- 最小生成树prim和kruskal模板
prim: int cost[MAX_V][MAX_V]; //cost[u][v]表示边e=(u,v)的权值(不存在的情况下设为INF) int mincost[MAX_V]; //从集合X出发的每 ...
- 在EORow或者VORow中对数据进行重复性校验
需求:在设置付款条件时不允许账期+付款方式重复. 由于本次需求仅需要对VO缓存中的数据进行重复性校验,所以仅需进行缓存遍历即可,不需要校验数据库. 方式1,在EORow的进行数据校验. public ...
- c# sqlbulkcopy批量插入数据
dt信息中包含数据和表名 public static void SqlBulkInsert(DataTable dt, string connStr) { try { using (var conn ...
- LambdaMART简介——基于Ranklib源码(一 lambda计算)
学习Machine Learning,阅读文献,看各种数学公式的推导,其实是一件很枯燥的事情.有的时候即使理解了数学推导过程,也仍然会一知半解,离自己写程序实现,似乎还有一道鸿沟.所幸的是,现在很多主 ...
- [QT][SQLITE]学习记录二 日期查询
资料例程: 1.dongfangyu SQL时间段查询 : http://blog.csdn.net/dongfangyu/article/details/4607236 2.痕网 - henw S ...