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/ ...
随机推荐
- HTML和CSS美化 登入框的页面
<div id="leftbody"> <p class="p0">如果您感觉您的网站够炫美可以提交给我们!</p> < ...
- __autoload自动加载类
在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利.这也是OO设计的基本思想之一.在PHP5之前,如果需要使用 ...
- python 矩阵转置
arrA=[[,,,],[,,,],[,,,],[,,,]] N= #声明4x4数组arr arrB=[[None] * N for row in range(N)] print('[原设置的矩阵内容 ...
- 教你上传代码到码云(与github一样)
以下所有操作都在命令行进行 1 git 配置 git config --global user.name “用户名” git config --global user.email “邮箱”2 生成公钥 ...
- 使用Zend studio+WAMP来调试Wordpress后台的PHP程序的一些非常关键的信息(原创)
一.Zend studio代码格式化快捷键:选中代码,Ctrl+Shift+F( 注意,在英文输入发状态下使用!) .Zend studio实用快捷键 :http://www.zendstudio.n ...
- 剑指 offer面试题20 顺时针打印矩阵
[题目描述] 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 【Scipy】初步认识
Scipy扩展包括多种多样的工具箱,这些工具致力于解决科学计算中的常见问题.不同的子模块对应不同的应用,比如插值, 整合, 优化, 图像处理, 统计, 特殊功能等等. scipy可以和其他的标准科学计 ...
- [ccf 4] 网络延时
网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为 1.他的交换机都连 ...
- bzoj2325
题解: 树链剖分 和普通的树链剖分不一样,这里的线段树不只是要记录x-y的和 而是要记录x左到y左,x左到y右,x右到y左,x右到y右 然后就可以了 代码: #include<bits/stdc ...
- ansible入门02
1.常用模块 1.1 group模块 添加或删除组 name= state=:present(添加),absent(删除) sy ...