C++大整数类
用法
把头文件和源代码文件放在同一目录下,然后#include"INT"即可使用。你能对int类的变量进行a=2,a+=3,a%8,a--等等操作,那你就也能对INT进行。INT基于vector,可以实现存储任意大的整数,且利用动态内存机制不会多浪费一点空间
类声明
class INT
{
public:
INT();
template <class T>
INT(T a);
INT(const string & s);
INT(const INT &a);
INT(const char * s);
template <class T>
INT & operator=(const T obj);
INT & operator=(const INT & obj);
friend istream & operator>>(istream & in , INT &a);
friend ostream & operator<<(ostream & out , INT &a);
operator bool();
friend INT operator+(INT a,INT b);
friend INT operator-(INT a,INT b);
friend INT operator*(INT a,INT b);
friend INT operator/(INT a,INT b);
friend INT operator%(INT a,INT b);
template <class T1>
friend INT operator+(T1 a,INT b);
template <class T1>
friend INT operator-(T1 a,INT b);
template <class T1>
friend INT operator*(T1 a,INT b);
template <class T1>
friend INT operator/(T1 a,INT b);
template <class T1>
friend INT operator%(T1 a,INT b);
template <class T2>
friend INT operator+(INT a,T2 b);
template <class T2>
friend INT operator-(INT a,T2 b);
template <class T2>
friend INT operator*(INT a,T2 b);
template <class T2>
friend INT operator/(INT a,T2 b);
template <class T2>
friend INT operator%(INT a,T2 b);
friend bool operator<(INT a,INT b);
friend bool operator>(INT a,INT b);
friend bool operator<=(INT a,INT b);
friend bool operator>=(INT a,INT b);
friend bool operator!=(INT a,INT b);
friend bool operator==(INT a,INT b);
template <class T>
inline INT& operator+=(T b);
template <class T>
inline INT& operator-=(T b);
template <class T>
inline INT& operator*=(T b);
template <class T>
inline INT& operator/=(T b);
template <class T>
inline INT& operator%=(T b);
inline INT& operator++();
inline INT& operator--();
inline INT operator++(int);
inline INT operator--(int);
inline INT operator-();
private:
vector<int> data;
bool sign;
static const long long int BIT=100000000;
static const short int BITb=8;
void print();
void clear();//去除多余的前导0
};
Code
#ifndef __gk_BigInt
#define __gk_BigInt
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
class INT
{
public:
INT();
template <class T>
INT(T a);
INT(const string & s);
INT(const INT &a);
INT(const char * s);
template <class T>
INT & operator=(const T obj);
INT & operator=(const INT & obj);
friend istream & operator>>(istream & in , INT &a);
friend ostream & operator<<(ostream & out , INT &a);
operator bool();
friend INT operator+(INT a,INT b);
friend INT operator-(INT a,INT b);
friend INT operator*(INT a,INT b);
friend INT operator/(INT a,INT b);
friend INT operator%(INT a,INT b);
template <class T1>
friend INT operator+(T1 a,INT b);
template <class T1>
friend INT operator-(T1 a,INT b);
template <class T1>
friend INT operator*(T1 a,INT b);
template <class T1>
friend INT operator/(T1 a,INT b);
template <class T1>
friend INT operator%(T1 a,INT b);
template <class T2>
friend INT operator+(INT a,T2 b);
template <class T2>
friend INT operator-(INT a,T2 b);
template <class T2>
friend INT operator*(INT a,T2 b);
template <class T2>
friend INT operator/(INT a,T2 b);
template <class T2>
friend INT operator%(INT a,T2 b);
friend bool operator<(INT a,INT b);
friend bool operator>(INT a,INT b);
friend bool operator<=(INT a,INT b);
friend bool operator>=(INT a,INT b);
friend bool operator!=(INT a,INT b);
friend bool operator==(INT a,INT b);
template <class T>
inline INT& operator+=(T b);
template <class T>
inline INT& operator-=(T b);
template <class T>
inline INT& operator*=(T b);
template <class T>
inline INT& operator/=(T b);
template <class T>
inline INT& operator%=(T b);
inline INT& operator++();
inline INT& operator--();
inline INT operator++(int);
inline INT operator--(int);
inline INT operator-();
private:
vector<int> data;
bool sign;
static const long long int BIT=100000000;
static const short int BITb=8;
void print();
void clear();//去除多余的前导0
};
INT Null(0);
INT::INT(const INT &a)
{
data=a.data;
sign=a.sign;
}
INT::INT()
{
data.resize(1);
sign=1;
}
INT::INT(const string & s)
{
int p=0,no=0;
data.resize(1);
sign=1;
for(int i=s.length()-1;i>=0;i--)
{
if(s[i]=='-')
{
sign=0;
continue;
}
no++;
int t=(s[i]-'0');
for(int j=1;j<no;j++)t*=10;
data[p]+=t;
if(no>=BITb)
{
data.push_back(0);
p++;
no=0;
}
}
clear();
}
INT::INT(const char * s)
{
int p=0,no=0;
data.resize(1);
sign=1;
for(int i=strlen(s)-1;i>=0;i--)
{
if(s[i]=='-')
{
sign=0;
continue;
}
no++;
int t=(s[i]-'0');
for(int j=1;j<no;j++)t*=10;
data[p]+=t;
if(no>=BITb)
{
data.push_back(0);
p++;
no=0;
}
}
clear();
}
template <class T>
INT::INT(T a)
{
if(a<0)
{
sign=0;
a=-a;
}
else sign=1;
for(short int p=0;a>0;p++)
{
data.push_back(0);
data[p]=a%BIT;
a/=BIT;
}
clear();
}
ostream & operator<<(ostream & out , INT &a)
{
a.print();
return out;
}
istream & operator>>(istream & in , INT &a)
{
string s;
cin>>s;
a=s;
return in;
}
INT & INT::operator=(const INT & obj)
{
if(this !=&obj)
{
data=obj.data;
sign=obj.sign;
}
return *this;
}
template <class T>
INT & INT::operator=(const T obj)
{
*this=INT(obj);
return *this;
}
INT operator+(INT a,INT b)
{
if(a.sign==0&&b.sign==0)
{
a.sign=b.sign=1;
INT t=a+b;
t.sign=0;
return t;
}
if(a.sign==1&&b.sign==0)
{
b.sign=1;
return a-b;
}
if(a.sign==0&&b.sign==1)
{
a.sign=1;
return b-a;
}
INT ans;
if(a.data.size()<b.data.size())return (b+a);
for(int i=0;i<b.data.size();i++)
{
ans.data.push_back(0);
ans.data[i]+=(a.data[i]+b.data[i])%INT::BIT;
ans.data[i+1]+=(a.data[i]+b.data[i])/INT::BIT;
}
for(int i=b.data.size();i<a.data.size();i++)
{
ans.data.push_back(0);
ans.data[i]+=a.data[i];
}
ans.clear();
return ans;
}
INT operator-(INT a,INT b)
{
if(a.sign==1&&b.sign==0)
{
b.sign=1;
return a+b;
}
if(a.sign==0&&b.sign==1)
{
a.sign=1;
INT t=a+b;
t.sign=0;
return t;
}
if(a.sign==0&&b.sign==0)
{
a.sign=b.sign=1;
return b-a;
}
if(a<b)
{
INT t=b-a;
t.sign=0;
return t;
}
INT ans;
if(a==b)return ans;
for(int i=1;i<a.data.size();i++)ans.data.push_back(0);
for(int i=0;i<a.data.size();i++)
{
ans.data[i]+=a.data[i]-b.data[i];
if(ans.data[i]<0)
{
ans.data[i]+=INT::BIT;
a.data[i+1]--;
}
}
ans.clear();
return ans;
}
INT operator*(INT a,INT b)
{
if(a.sign==1&&b.sign==0)
{
b.sign=1;
INT t=a*b;
t.sign=0;
return t;
}
if(a.sign==0&&b.sign==1)
{
a.sign=1;
INT t=a*b;
t.sign=0;
return t;
}
if(a.sign==0&&b.sign==0)
{
a.sign=b.sign=1;
return a*b;
}
INT ans;
if(a==INT(0)||b==INT(0))return ans;
for(int i=1;i<=a.data.size()+b.data.size();i++)ans.data.push_back(0);
for(int i=0;i<a.data.size();i++)
{
for(int j=0;j<b.data.size();j++)
{
long long t=(long long)a.data[i]*b.data[j];
ans.data[i+j]+=t%INT::BIT;
ans.data[i+j+1]+=t/INT::BIT;
}
}
ans.clear();
return ans;
}
//能跑,但是有极大优化空间,但是懒得优化了,有空再说
INT operator/(INT a,INT b)
{
if(a.sign==0&&b.sign==0)
{
a.sign=b.sign=1;
return a/b;
}
if(a.sign==0&&b.sign==1)
{
a.sign=1;
INT t=a/b;
t.sign=0;
return t;
}
if(a.sign==1&&b.sign==0)
{
b.sign=1;
INT t=a/b;
t.sign=0;
return t;
}
INT ans;
while(a-b>Null)
{
a=a-b;
ans++;
}
return ans;
}
INT operator%(INT a,INT b)
{
if(a.sign==0||b.sign==0)
{
cout<<"error,未定义负数的求模运算"<<endl;
return INT(-1);
}
else
{
while(a-b>Null)
a=a-b;
return a;
}
}
template <class T1>
INT operator+(T1 a,INT b)
{
INT A(a);
return A+b;
}
template <class T1>
INT operator-(T1 a,INT b)
{
INT A(a);
return A-b;
}
template <class T1>
INT operator*(T1 a,INT b)
{
INT A(a);
return A*b;
}
template <class T1>
INT operator/(T1 a,INT b)
{
INT A(a);
return A/b;
}
template <class T1>
INT operator%(T1 a,INT b)
{
INT A(a);
return A%b;
}
template <class T2>
INT operator+(INT a,T2 b)
{
INT B(b);
return a+B;
}
template <class T2>
INT operator-(INT a,T2 b)
{
INT B(b);
return a-B;
}
template <class T2>
INT operator*(INT a,T2 b)
{
INT B(b);
return a*B;
}
template <class T2>
INT operator/(INT a,T2 b)
{
INT B(b);
return a/B;
}
template <class T2>
INT operator%(INT a,T2 b)
{
INT B(b);
return a%B;
}
bool operator<(INT a,INT b)
{
if(a.sign==1&&b.sign==0)return false;
if(a.sign==0&&b.sign==1)return true;
if(a.sign==0&&b.sign==0)
{
a.sign=b.sign=1;
return b<a;
}
if(a.data.size()>b.data.size())return false;
else if(a.data.size()<b.data.size())return true;
if(a.data.size()==1&&a.data[0]==b.data[0]&&a.data[0]==0)return false;
for(int i=a.data.size()-1;i>=0;i--)
{
if(a.data[i]<b.data[i])return true;
if(a.data[i]>b.data[i])return false;
}
return false;
}
bool operator==(INT a,INT b)
{
if(a.sign!=b.sign)
{
if(a.data[0]==b.data[0]&&a.data[0]==0&&a.data.size()==b.data.size()&&a.data.size()==1)
return 1;
else
return 0;
}
if(a.data.size()!=b.data.size())return 0;
for(int i=0;i<a.data.size();i++)
if(a.data[i]!=b.data[i])
return 0;
return 1;
}
bool operator!=(INT a,INT b)
{
return !(a==b);
}
bool operator>(INT a,INT b)
{
return a>=b&&a!=b;
}
bool operator<=(INT a,INT b)
{
return (a<b||a==b);
}
bool operator>=(INT a,INT b)
{
return !(a<b);
}
template <class T>
inline INT& INT::operator+=(T b)
{
*this=*this+INT(b);
return *this;
}
template <class T>
inline INT& INT::operator-=(T b)
{
*this=*this-INT(b);
return *this;
}
template <class T>
inline INT& INT::operator*=(T b)
{
*this=*this*INT(b);
return *this;
}
template <class T>
inline INT& INT::operator/=(T b)
{
*this=*this/INT(b);
return *this;
}
template <class T>
inline INT& INT::operator%=(T b)
{
*this=*this%INT(b);
return *this;
}
inline INT& INT::operator++()
{
*this=*this+INT(1);
return *this;
}
inline INT& INT::operator--()
{
*this=*this-INT(1);
return *this;
}
inline INT INT::operator++(int)
{
INT t= *this;
*this=*this+INT(1);
return t;
}
inline INT INT::operator--(int)
{
INT t=*this;
*this=*this+INT(1);
return t;
}
void INT::print()
{
if(data.size()==1&&data[0]==0||data.size()==0)
{
cout<<0;
return;
}
if(sign==0)cout<<'-';
clear();
cout<<data.back();
for(int i=data.size()-2;i>=0;i--)
{
if(data[i]==0)for(int i=1;i< BIT ;i*=10)cout<<'0';
else
{
int x=0;
for(int t=data[i];t>0;t/=10)x++;
for(int i=1;i<=8-x;i++)cout<<'0';
cout<<data[i];
}
}
}
void INT::clear()
{
while(data.size()>1&&data.back()==0)
data.pop_back();
}
INT::operator bool()
{
if(data.size()==1&&data[0]==0||data.size()==0)
return false;
else
return true;
}
inline INT INT::operator-()
{
INT newthis(*this);
if(newthis.sign==0)newthis.sign=1;
else newthis.sign=0;
return newthis;
}
#endif
测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
C++大整数类的更多相关文章
- C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)
但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...
- N!的阶乘附带简单大整数类的输入输出(暂时没有深入的了解)
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 我的思路:就想着大整数类去了,才发现自己还不能很好的掌握,其实这是一个大 ...
- C++高精度计算(大整数类)
Java和Pathon可以不用往下看了 C++的基本数据类型中,范围最大的数据类型不同编译器不同,但是最大的整数范围只有[-2^63-2^63-1](对应8个字节所对应的二进制数大小).但是对于某些需 ...
- 大整数类BIGN的设计与实现 C++高精度模板
首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...
- 用Java的大整数类BigInteger来实现大整数的一些运算
关于BigInteger的构造函数,一般会用到两个: BigInteger(String val); //将指定字符串转换为十进制表示形式: BigInteger(String val,int rad ...
- [ C++ 快速高精度模板 ] [ BigN类 ] 大整数类 高精度 模板 BigInt FFT 快速傅里叶变换
[原创 转载请注明]瞎写的,如果代码有错,或者各位大佬有什么意见建议,望不吝赐教 更新日志: 对于规模较小的整数乘法使用$$O(n^2)$$方法,提高速度 modify()和operator[]的bu ...
- C++ BigInteger 大整数类模板(转)
#include <deque> #include <vector> #include <iostream> #include <string> #in ...
- C++大整数类模板
参考 :http://172.21.85.56/oj/resource/reportdetail?report_id=1678 支持 =.abs().pow().+=.-= *=./=.%=.+.-. ...
- 【Java编程】Java中的大整数计算
在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的Big ...
- Ural 1158. Censored! 有限状态自动机+DP+大整数
Ural1158 看上去很困难的一道题. 原文地址 http://blog.csdn.net/prolightsfxjh/article/details/54729646 题意:给出n个不同的字符,用 ...
随机推荐
- django模型不应该作为参数传递给task
Django 模型对象.它们不应该作为任务的参数传递.当任务运行时从数据库重新获取对象几乎总是更好,因为使用旧数据可能会导致竞争条件. 想象一下以下场景,您有一篇文章和一个自动扩展其中一些缩写的任务: ...
- 【C#】【串口通信(Serial Port)】【实例】建议串口调试WinForm桌面应用实例——已实现功能<存在未知BUG>
1.界面组件 2.界面实现代码 1 namespace WinFormsApp1 2 { 3 partial class Form1 4 { 5 /// <summary> 6 /// R ...
- ESXi6.7物理机安装之网卡驱动封装Realtek PCIe GBE Family Controller =瑞昱r8168网卡驱动
https://blog.whsir.com/post-3423.html "我这里先提供一个ESXI6.5封装好的r8168网卡驱动ESXI6.5u2.iso,如果你的网卡也是这个,可以直 ...
- python异步编程之asyncio低阶API
低阶API介绍 asyncio中低阶API的种类很多,涉及到开发的5个方面.包括: 获取事件循环 事件循环方法集 传输 协议 事件循环策略 本篇中只讲解asyncio常见常用的函数,很多底层函数如网络 ...
- 遍历菜单树得到所有菜单ids
1.前言 在我们实现菜单管理页面的时候,有时候我们需要默认展开所有的菜单列表,但是因为后端有时候没有返回所有菜单ids数组. 而且我们也不容易获取到所有菜单ids,比如如果我们通过角色id查询到所有菜 ...
- Vue 2 和 Vue 3 中 toRefs的区别
摘要:本文将介绍 Vue 2 和 Vue 3 中 toRefs 函数的不同用法和行为,并解释其在各个版本中的作用. 正文: Vue 是一款流行的 JavaScript 框架,用于构建用户界面.在 Vu ...
- 完美解决Python词云库wordcloud不显示中文问题
你的Python词云库wordcloud显示的都是方框吗?别担心,我有一个妙招让你的中文词云变得美观又清晰! 背景: wordcloud是一个基于python的词云生成库,它可以让你用简单的代码创建出 ...
- Kuasar成为CNCF官方项目,探索容器运行时新纪元
本文分享自华为云社区<Kuasar成为CNCF官方项目,探索容器运行时新纪元!>,作者:云容器大未来. 北京时间12月20日,云原生计算基金会(CNCF)正式接纳多沙箱容器运行时项目 Ku ...
- 华为云PB级数据库GaussDB(for Redis)解析第二期:Redis消息队列Stream的应用探讨
摘要:本文将对Stream的常用命令和应用场景进行介绍,并探讨原生Redis Stream消息队列的缺陷以及GaussDB(for Redis)提供的解决方案,供大家学习和选用. 华为云高斯Redis ...
- 基于Redis + Lua脚本的设计红包雨
摘要:红包雨是一个典型的高并发场景,短时间内有海量请求访问服务端,为了让系统运行顺畅,抢红包采用了基于 Redis + Lua 脚本的设计方案. 本文分享自华为云社区<红包雨中:Redis 和 ...