c++大整数
这里不是必须用c++的话不推荐用c++大整数,py和java的支持要好得多。
大整数类 (非负)
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct BigInteger{
static const int BASE=100000000;
static const int WIDTH=8;
vector<int> s;
BigInteger(long long num=0){*this = 0}//构造函数
BigInteger operator =(long long num){
s.clear();
do{
s.push_back(num%BASE);
num/=BASE;
}while(num>0);
return *this;
}
BigInteger operator = (const string& str){
s.clear();
int x,len=(str.length()-1)/WIDTH+1;
for(int i=0;i<len;i++){
int end=s.length()-i*WIDTH;
int start=max(0,end-WIDTH);
sscanf(str.substr(start,end).c_str(),"%d",&x);
s.push_back(x);
}
return *this;
}
BigInteger operator + (const BigInteger &b) const {
BigInteger c;
c.s.clear();
int i,g;
int x;
for(i=0,g=0;;i++){
if(g==0&&i>=s.size()&&i>=b.s.size()){//无进位,两个BigInteger实例均已遍历完成
break;
x=g;
if(i<s.size())
x+=s[i];
if(i<b.s.size())
x+=b.s[i];
c.s.push_back(x%BASE);
g=x/BASE;
}
return c;
}
BigInteger operater+=(const BigInteger &b){
*this=*this+b;return *this;
}
BigInteger operator - (const BigInteger& b) const
{
BigInteger c;
c.s.clear();
int MAX=std::max(s.size(),b.s.size());
for(int i=0,g=0;;i++)
{
if(g==0&&i>=MAX)
break;
int x=g;
if(i<s.size())
x+=s[i];
if(i<b.s.size())
x-=b.s[i];
if(i==MAX-1)
c.s.push_back(x%BASE);
else
c.s.push_back(abs(x%BASE));
g=x/BASE;
}
return c;
}
BigInteger operator -= (const BigInteger& b)
{
*this=*this-b;
return *this;
}
BigInteger operator * (const BigInteger& b)
{
std::stringstream ss;
for(int i=s.size()-1;i>=0;i--)
ss<<s[i];
std::string operand1=ss.str();
ss.str("");
for(int i=b.s.size()-1;i>=0;i--)
ss<<b.s[i];
std::string operand2=ss.str();
std::vector<int> c,d,temp;
for(int i=operand1.length()-1;i>=0;i--)
c.push_back(operand1[i]-'0');
for(int i=operand2.length()-1;i>=0;i--)
d.push_back(operand2[i]-'0');
int MAX=std::max(c.size(),d.size());
for(int i=0;i<MAX*2+1;i++)
temp.push_back(0);
for(int i=0;i<c.size();i++)
for(int j=0;j<d.size();j++)
temp[i+j]+=c[i]*d[j];
for(int i=0;i<2*MAX+1;i++)
if(temp[i]>9)
{
temp[i+1]+=temp[i]/10;
temp[i]%=10;
}
int m=2*MAX;
while(temp[m]==0)
m--;
BigInteger another;
another.s.clear();
int len=(m-1)/WIDTH+1;
for(int i=0;i<len;i++)
another.s.push_back(0);
for(int i=0;i<len;i++)
{
int x=1;
int k=0;
int end=std::min(m+1,(i+1)*WIDTH);
int start=i*WIDTH;
for(int j=start;j<end;j++)
{
k+=x*temp[j];
x*=10;
}
another.s[i]=k;
}
return another;
}
BigInteger operator *= (const BigInteger& b)
{
*this=*this*b;
return *this;
}
//自己写的除法,可以实现像int型一样的效果
BigInteger operator / (const BigInteger& b)
{
std::string operand1,operand2,result;
std::stringstream ss;
for(int i=s.size()-1;i>=0;i--)
ss<<s[i];
operand1=ss.str();
ss.str("");
for(int i=b.s.size()-1;i>=0;i--)
ss<<b.s[i];
operand2=ss.str();
int len1,len2;
len1=operand1.length();
len2=operand2.length();
if(len1<len2) //若操作数1小于操作数2,返回0
return 0;
if(*this==b) //若两数相等,返回1,这里用到下面的“==”重载运算符
return 1;
std::vector<int> c,d;
for(int i=0;i<len1;i++)
{
c.push_back(operand1[i]-'0');
if(i<len2)
d.push_back(operand2[i]-'0');
else
d.push_back(0);
}
int time=len1-len2;
int len=len1;
int k,l=0;
for(int i=0;i<=time;i++)
{
int ok=1;
k=0;
do{
if(c[l]==0)
{
l++;
ok=0;
len1--;
}
if(len==len1)
{
int j=0;
while(j<len2)
{
if(c[i+j]>d[j]) //第一次大就表示operand1 > operand2
{
ok=1;
break;
}
else if(c[i+j]<d[j]) //第一次小就表示operand1 < operand2
{
ok=0;
break;
}
j++;
}
}
if(ok)
{
for(int j=0;j<len;j++)
{
c[j+i]-=d[j];
if(c[j+i]<0)
{
c[j+i-1]--;
c[j+i]+=10;
}
}
k++;
}
}while(ok);
len--;
result+=k+'0';
}
BigInteger temp;
temp=result;
return temp;
}
BigInteger operator /= (const BigInteger& b)
{
*this=*this/b;
return *this;
}
//以下的重载方法全都在上面的四则运算上编写,不再介绍
BigInteger operator % (const BigInteger& b)
{
BigInteger c;
c=*this-(*this/b)*b;
return c;
}
BigInteger operator %= (const BigInteger& b)
{
*this=*this%b;
return *this;
}
bool operator < (const BigInteger& b) const
{
if(s.size()!=b.s.size())
return s.size()<b.s.size();
for(int i=s.size()-1;i>=0;i--)
if(s[i]!=b.s[i])
return s[i]<b.s[i];
return false;//相等
}
bool operator > (const BigInteger& b) const
{
return b<*this;
}
bool operator <= (const BigInteger& b) const
{
return !(b<*this);
}
bool operator >= (const BigInteger& b) const
{
return !(*this<b);
}
bool operator != (const BigInteger& b) const
{
return *this<b||*this>b;
}
bool operator == (const BigInteger& b) const
{
return !(*this<b)&&!(*this>b);
}
friend std::ostream& operator << (std::ostream& out,const BigInteger& x)
{
out<<x.s.back();
for(int i=x.s.size()-2;i>=0;i--)
{
char buf[20];
sprintf(buf,"%08d",x.s[i]);
for(int j=0;j<strlen(buf);j++)
out<<buf[j];
}
return out;
}
friend std::istream& operator >> (std::istream& in,BigInteger& x)
{
std::string s;
if(!(in>>s))
return in;
x=s;
return in;
}
};
istream& operator >> (istream &in, BigInteger &x){
string s;
if(!(in>>x)) return in;
x=s;
return in;
}
ostream& operator << (ostream &out,const BigInteger &x){
out << x.s.back();//最高位不足8位的预防处理
int i;
for(i=x.s.size()-2;i>=0;i--){
char buf[20];
sprintf(buf,"%08d",x.s[i]);//不足8位补0
for(int j=0;j<strlen(buf);j++)
out<<buf[j];
}
return out;
}
说明: static const int BASE=100000000;这个常数不属于 BigInteger类型的结构体变量,而属于 BigInteger这个类型,称为静态成员变量。在 BigInteger的成员函数内可以直接使用,但是在其他地方,用 BigInteger::BASE
c++大整数的更多相关文章
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
- AC日记——大整数的因子 openjudge 1.6 13
13:大整数的因子 总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k. 输入 ...
- Ac日记——大整数减法 openjudge 1.6 11
11:大整数减法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个大的正整数相减的差. 输入 共2行,第1行是被减数a,第2行是减数b(a > b).每个大整数不超过20 ...
- AC日记——大整数加法 openjudge 1.6 10
10:大整数加法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 ...
- vijos-1447 开关灯泡-大整数开方算法
描述 一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 提示 范围:40 ...
- poj2305-Basic remains(进制转换 + 大整数取模)
进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串-&g ...
- [转载]JavaScript 中小数和大整数的精度丢失
标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...
- ACM学习之路————一个大整数与一个小整数不得不说得的秘密
这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...
- 华为"128为大整数相加"机试题
最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...
- POJ C++程序设计 编程题#1 大整数的加减乘除
编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...
随机推荐
- 解决ROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'creat table study_record( id int(11) not null
之前一直用的好好的,突然就出现了这个错误: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual tha ...
- px转rem的填坑之路
这是要为一个vue项目做自适应,设计稿是1920*1080的,要适应各种手机.ipad.3840*2160的超大屏,所以就选择了rem,包用的是 postcss-pxtorem 在适配的时候遇到了很多 ...
- Pytorch入门——手把手教你MNIST手写数字识别
MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...
- STL_string容器
一.string概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别. ...
- std::thread线程库详解(3)
目录 目录 前言 lock_guard scoped_lock (C++17) unique_lock shared_lock 总结 ref 前言 前两篇的博文分别介绍了标准库里面的线程和锁,这一次的 ...
- 【故障公告】K8s CofigMap 挂载问题引发网站故障
今天凌晨我们用阿里云服务器自建的 kubernetes 集群出现突发异常情况,博客站点(blog-web)与博客 web api(blog-api)的 pod 无法正常启动(CrashLoopBack ...
- 我为什么不鼓吹 WireGuard
原文链接:https://fuckcloudnative.io/posts/why-not-wireguard/ 最近有一款新型 VPN 工具备受瞩目,相信很多人已经听说过了,没错就是 WireGua ...
- Web自动化测试python环境中安装 --selenium安装、火狐和火狐驱动版本、谷歌和谷歌驱动版本、测试
一.安装selenium Windows命令行(cmd)输入pip install selenium(无须指定版本默认最新)或 pip install selenium==3.141.0(可指定版本) ...
- Result Maps collection already contains value for xxxMapper.BaseResultMap错误解决办法
原因分析: 这些代码因为是工具自动生成的,所以也没仔细检查.一个小小的错误,导致的. 解决办法: 1.由于使用ibatis的TempTestTableMapper.xml实现接口TempTestTab ...
- tcpdump抓包及tshark解包方法介绍
tshark是wireshark的命令行工具,通过shell命令抓取.解析报文.tcpdump是Linux系统下的抓包工具.wireshark和tcpdump都共同使用 libpcap作为其底层抓包的 ...