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/ ...
随机推荐
- Java发送带html标签内容的邮件
package test; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; im ...
- JDK_源码
1.http://hg.openjdk.java.net/ (ZC:这个貌似像官网的样子,不知道 到底是不是...) 1.1.jdk8u_jdk8u_jdk_ 5b86f66575b7 _src_.h ...
- 为什么需要消息队列MQ?
主要原因:是在高并发情况下,由于来不及同步处理,请求往往会发生堵塞,比如诸多的insert.update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积很多,从而触发大量的to ...
- Learn Rails5.2-- rails base(含官方指导Debugging 摘录)
豆知识扩展: <meta> https://www.cnblogs.com/chentianwei/p/9183799.html css selector div > p 选择所有 ...
- UVA-1149 Bin Packing (贪心)
题目大意:给定n个物品的重量,无限个容量为m的箱子,每个箱子最多装两个物品,要把所有的物品都装下,最少需要多少个箱子. 题目分析:贪心策略:每次将最重和最轻的两个物品放到一个箱子里,如果装不下,则将最 ...
- 【Python】重载模块
命令窗口中调试代码,往往需要重载模块已进行最新的代码调试. 主要有两种方式: 1. Python shell 窗口 reload(module) 2. ipython 窗口 %load_ext aut ...
- Nvidia Driver
https://www.if-not-true-then-false.com/2015/fedora-nvidia-guide/ https://javacodes.cn/322.html https ...
- iOS笔记之线程
dispatch_after dispatch_after能让我们添加进队列的任务延时执行,比如想让一个Block在10秒后执行: var time = dispatch_time(DISPATCH_ ...
- (转)OAuth 2.0的设计思路
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...
- C++ readdir、readdir_r函数
readdir, readdir_r - 读一个目录 readdir函数: struct dirent *readdir(DIR *dirp); The data returned by read ...