这里不是必须用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++大整数的更多相关文章

  1. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

  2. AC日记——大整数的因子 openjudge 1.6 13

    13:大整数的因子 总时间限制:  1000ms 内存限制:  65536kB 描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k. 输入 ...

  3. Ac日记——大整数减法 openjudge 1.6 11

    11:大整数减法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个大的正整数相减的差. 输入 共2行,第1行是被减数a,第2行是减数b(a > b).每个大整数不超过20 ...

  4. AC日记——大整数加法 openjudge 1.6 10

    10:大整数加法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 ...

  5. vijos-1447 开关灯泡-大整数开方算法

    描述 一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 提示 范围:40 ...

  6. poj2305-Basic remains(进制转换 + 大整数取模)

    进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串-&g ...

  7. [转载]JavaScript 中小数和大整数的精度丢失

    标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...

  8. ACM学习之路————一个大整数与一个小整数不得不说得的秘密

    这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...

  9. 华为"128为大整数相加"机试题

    最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...

  10. POJ C++程序设计 编程题#1 大整数的加减乘除

    编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

随机推荐

  1. 【七天搞定Python】day01.Python环境配置、pip、IDE、注释、变量,数据类型、标识符/关键字、输出、输入

    什么是Python? 动态解释型语言,1982年由荷兰人Guido von Rossum发明. 更多细节可以google,这里不做展开. Python解释器: CPython(官方版本C语言实现) I ...

  2. 使用idea插件识别log文件的相关设置

    最近要读一些spring boot项目产生的log文件,众所周知,idea拥有强大的插件系统.当我打开log文件时,idea自动帮我推荐了ideolog这个插件. 但是当我安装好之后发现系统并不能完全 ...

  3. 与图论的邂逅06:dfs找环

    当我在准备做基环树的题时,经常有了正解的思路确发现不会找环,,,,,,因为我实在太蒻了. 所以我准备梳理一下找环的方法: 有向图 先维护一个栈,把遍历到的节点一个个地入栈.当我们从一个节点x回溯时无非 ...

  4. HTML基础复习4

    CSS的应用 模块的边框 设置边框样式 border-style::如果是一个值那么表示四个边的样式都一样:如果是两个值那么第一个值代表上下,第二个值代表左右:如果是三个值,第一个值代表上,第二个值代 ...

  5. gRPC Load Balancing

    gRPC Load Balancing 翻译自:https://grpc.io/blog/grpc-load-balancing/ 这是gRPC负载均衡的第一篇,后续会给出基于golang XDS服务 ...

  6. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  7. 你可能会问,为什么不直接进入 CLOSED 状态,而要停留在 TIME_WAIT 这个状态?

    你可能会问,为什么不直接进入 CLOSED 状态,而要停留在 TIME_WAIT 这个状态? 划重点,2MSL 的时间是从主机 1 接收到 FIN 后发送 ACK 开始计时的:如果在 TIME_WAI ...

  8. (Oracle)索引实战(转载)

    人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS ...

  9. KMP算法 字符串匹配(看猫片)

    前言 此篇笔记根据自己的理解和练习心得来解释算法,只代表个人观点,如有不足请指出(我刚学QWQ) 浅谈字符串匹配 设想一个场景,假设你是一个净化网络语言环境的管理员,每天需要翻阅大量的文章和帖子来查找 ...

  10. 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

    前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...