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

原文地址:https://www.cnblogs.com/lqerio/p/11117608.html

时间: 2024-10-31 09:02:26

c++大整数的相关文章

第二大整数

第二大整数 问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来.说明:(1)0表示输入结束,它本身并不计入这组整数中.(2)在这组整数中,既有正数,也可能有负数.(3)这组整数的个数不少于2个. 输入格式:输入只有一行,包括若干个整数,中间用空格隔开,最后一个整数为0. 输出格式:输出第二大的那个整数. 输入输出样例 样例输入 5 8 -12 7 0 样例输出 7 #include <stdio.h

初涉算法——大整数类

处理方法:用数组存储整数. C++好处:重载运算符,使大整数类可以像int一样使用. 结构体BigInteger可用于储存高精度非负整数: 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<iostream> 5 using namespace std; 6 7 struct BigInteger { 8 static const int BASE = 100000000

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

POJ 1181 大整数是否为素数以及求大整数的质因数-数论-(Miller_rabin+Pollard_rho)

题意:求一个整数是否是素数,如果不是,则输出它最小的质因数. 分析: 判断一个大整数是否为素数用Miller_rabin算法,求一个大整数的所有质因数用Pollard_rho算法.这题就是直接套模板. 另外这里的gcd和pow_mod不能用一般的方式,T了.代码里我注释掉的就是T了的写法. 代码: #include<iostream> #include<cmath> #include<ctime> #include<cstdio> #include<a

大整数类

大整数类又叫高精度. 就是求大数的四则运算的算法, (其实就是模拟小学生算数的方法, 什么? 你不会, 那你还不如小学生, 哈哈!). 在这里只贴加法运算符的重载,其他的运算符与加法类似.闲言少叙, 直接上代码(小声告诉你, 里面用了几个库函数和STL, 嘿嘿!!!). 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<iostream> 5 using namespac

大整数算法[11] Karatsuba乘法

★ 引子         前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) 的限制,需要从一个完全不同的角度来看待乘法.在下面的乘法算法中,需要使用 x 和 y 这两个大整数的多项式基表达式 f(x) 和 g(x) 来表示. 令 f(x) = a * x + b,g(x) = c * x + d,h(x) = f(x) * g(x).这里的 x 相当于一个基,比如十进制下,

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加. 解题思路: 1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345 和{9,6,5,9,5}

大整数的乘法运算

思想:每次取第二个数的最高位进行一次乘法,把结果乘以10和下一次结果相加,题目来源:leetcode class Solution { public: //一个整数乘以一个个位数 string multOneBit(string num,int data) { int i = num.size() - 1,carry = 0; string res; for(;i >= 0;--i) { int value = (num[i] - '0') * data + carry; carry = val

大整数乘法python3实现

由于python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,但是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位置开始算的.代码如下: import sys def list2str(li): while li[0]==0: del li[0] res='' for i in li: res+=str(i) return res def multi(stra,strb): aa=list(stra) bb=l

大整数运算

对于A,B的范围在int范围内,求解A与B的加减乘除运算我相信大家很快就可以写出程序来,但是如果A,B是有着1000个数位的整数呢?恐怕就没有已有的数据类型来表示了,这时候只能老实的模拟加减乘除运算的过程.模拟加减乘除的运算的过程,原理就是小学的. 大整数又称为高精度整数,其含义就是用基本的数据类型无法存储其精度的整数.大整数运算即高精度运算. 首先,介绍大整数的存储. 很简单,用数组即可.例如,int型数组d[1000]:如将123456存储到数组中,则有d[0]=6,d[1]=5......