`
EGG_BMJIAOYANG
  • 浏览: 5215 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++大数

    博客分类:
  • C++
c++ 
阅读更多
分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法、减法、乘法、除法、n次方、取模、大小比较、赋值以及输入流、输出流的重载。。


#include<iostream>
#include<string>
#include<iomanip>
#include<algorithm>
using namespace std;

#define MAXN 9999
#define MAXSIZE 10
#define DLEN 4

class BigNum
{
private:
int a[500];    //可以控制大数的位数
int len;       //大数长度
public:
BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数
BigNum(const int);       //将一个int类型的变量转化为大数
BigNum(const char*);     //将一个字符串类型的变量转化为大数
BigNum(const BigNum &);  //拷贝构造函数
BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算

friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符

BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算

BigNum operator^(const int  &) const;    //大数的n次方运算
int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算   
bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较

void print();       //输出大数
};
BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
{
int c,d = b;
len = 0;
memset(a,0,sizeof(a));
while(d > MAXN)
{
c = d - (d / (MAXN + 1)) * (MAXN + 1);
d = d / (MAXN + 1);
a[len++] = c;
}
a[len++] = d;
}
BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
{
int t,k,index,l,i;
memset(a,0,sizeof(a));
l=strlen(s);  
len=l/DLEN;
if(l%DLEN)
len++;
index=0;
for(i=l-1;i>=0;i-=DLEN)
{
t=0;
k=i-DLEN+1;
if(k<0)
k=0;
for(int j=k;j<=i;j++)
t=t*10+s[j]-'0';
a[index++]=t;
}
}
BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
{
int i;
memset(a,0,sizeof(a));
for(i = 0 ; i < len ; i++)
a[i] = T.a[i];
}
BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
{
int i;
len = n.len;
memset(a,0,sizeof(a));
for(i = 0 ; i < len ; i++)
a[i] = n.a[i];
return *this;
}
istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符
{
char ch[MAXSIZE*4];
int i = -1;
in>>ch;
int l=strlen(ch);
int count=0,sum=0;
for(i=l-1;i>=0;)
{
sum = 0;
int t=1;
for(int j=0;j<4&&i>=0;j++,i--,t*=10)
{
sum+=(ch[i]-'0')*t;
}
b.a[count]=sum;
count++;
}
b.len =count++;
return in;

}
ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
{
int i; 
cout << b.a[b.len - 1];
for(i = b.len - 2 ; i >= 0 ; i--)
{
cout.width(DLEN);
cout.fill('0');
cout << b.a[i];
}
return out;
}

BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
{
BigNum t(*this);
int i,big;      //位数  
big = T.len > len ? T.len : len;
for(i = 0 ; i < big ; i++)
{
t.a[i] +=T.a[i];
if(t.a[i] > MAXN)
{
t.a[i + 1]++;
t.a[i] -=MAXN+1;
}
}
if(t.a[big] != 0)
t.len = big + 1;
else
t.len = big;  
return t;
}
BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算

int i,j,big;
bool flag;
BigNum t1,t2;
if(*this>T)
{
t1=*this;
t2=T;
flag=0;
}
else
{
t1=T;
t2=*this;
flag=1;
}
big=t1.len;
for(i = 0 ; i < big ; i++)
{
if(t1.a[i] < t2.a[i])
{
j = i + 1;
while(t1.a[j] == 0)
j++;
t1.a[j--]--;
while(j > i)
t1.a[j--] += MAXN;
t1.a[i] += MAXN + 1 - t2.a[i];
}
else
t1.a[i] -= t2.a[i];
}
t1.len = big;
while(t1.a[len - 1] == 0 && t1.len > 1)
{
t1.len--;
big--;
}
if(flag)
t1.a[big-1]=0-t1.a[big-1];
return t1;
}

BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
{
BigNum ret;
int i,j,up;
int temp,temp1;  
for(i = 0 ; i < len ; i++)
{
up = 0;
for(j = 0 ; j < T.len ; j++)
{
temp = a[i] * T.a[j] + ret.a[i + j] + up;
if(temp > MAXN)
{
temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
up = temp / (MAXN + 1);
ret.a[i + j] = temp1;
}
else
{
up = 0;
ret.a[i + j] = temp;
}
}
if(up != 0)
ret.a[i + j] = up;
}
ret.len = i + j;
while(ret.a[ret.len - 1] == 0 && ret.len > 1)
ret.len--;
return ret;
}
BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
{
BigNum ret;
int i,down = 0;  
for(i = len - 1 ; i >= 0 ; i--)
{
ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
}
ret.len = len;
while(ret.a[ret.len - 1] == 0 && ret.len > 1)
ret.len--;
return ret;
}
int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算   
{
int i,d=0;
for (i = len-1; i>=0; i--)
{
d = ((d * (MAXN+1))% b + a[i])% b; 
}
return d;
}
BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
{
BigNum t,ret(1);
int i;
if(n<0)
exit(-1);
if(n==0)
return 1;
if(n==1)
return *this;
int m=n;
while(m>1)
{
t=*this;
for( i=1;i<<1<=m;i<<=1)
{
t=t*t;
}
m-=i;
ret=ret*t;
if(m==1)
ret=ret*(*this);
}
return ret;
}
bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
{
int ln;
if(len > T.len)
return true;
else if(len == T.len)
{
ln = len - 1;
while(a[ln] == T.a[ln] && ln >= 0)
ln--;
if(ln >= 0 && a[ln] > T.a[ln])
return true;
else
return false;
}
else
return false;
}
bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
{
BigNum b(t);
return *this>b;
}

void BigNum::print()    //输出大数
{
int i;  
cout << a[len - 1];
for(i = len - 2 ; i >= 0 ; i--)
{
cout.width(DLEN);
cout.fill('0');
cout << a[i];
}
cout << endl;
}
int main(void)
{
int i,n;
BigNum x[101];      //定义大数的对象数组
x[0]=1;
for(i=1;i<101;i++)
x[i]=x[i-1]*(4*i-2)/(i+1);
while(scanf("%d",&n)==1 && n!=-1)
{
x[n].print();
}
}
分享到:
评论

相关推荐

    C++大数相加减

    C++标准库并未提供内置的大数支持,因此要实现大数相加减的功能,通常需要自定义数据结构和算法。这个项目"BigNumberAdd"显然是关于如何用C++来实现大数加法和减法的示例。 首先,我们要创建一个表示大数的数据结构...

    C++大数类封装

    封装好的C++大数类,很全面,包括运算符重载,大数的加、减、乘、除

    gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度

    在标题“gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度”中,我们关注的是用C语言和C++实现的高精度算法,特别是大数的加法、减法、乘法和除法。这些操作是基础数学运算,但在计算机中...

    简单的C++ 大数类

    这个"简单的C++大数类"是作者自定义实现的一个C++库,专门用于处理大数运算。以下是对这个类的一些关键知识点的详细说明: 1. **大数表示**:大数类通常使用数组或链表存储多位数字,每个元素代表一个位。在这个C++...

    C++大数计算简单实例测试

    本项目“C++大数计算简单实例测试”提供了一个基本的解决方案,用于进行大数的算术运算,如加法、减法、乘法等。以下将详细介绍该实例所涵盖的C++知识点。 1. **自定义数据结构**: 在C++中,由于没有内置的大数...

    c++大数模板

    c++大数模板 内含各种大数操作 还可以自己设置数的长度

    大数类c++大数类

    大数类C++实现详解 大数类是一个重要的数据结构在计算机科学中,它可以用来表示非常大的整数,通常超过了机器字长的限制。在C++中,可以通过重载运算符和实现自定义的整数类来实现大数类。 在这个示例代码中,我们...

    C++大数加减乘

    用c++实现大数加减乘,绝对可以实现。希望分享

    D.rar_c++大数除法

    在C++编程中,处理大数(通常超过标准整型或浮点型所能表示的范围)的除法是一项挑战,特别是在需要保持精确性时,如本例中的100位大数除法并保留100位小数。C++标准库并不直接支持这种操作,因此我们需要自定义算法...

    C++ 大数运算类

    实现各种常用的运算法则,如+、-、*、/、%、++、--、+=、-=、*=、%=、/=、&gt;、&lt;、、&gt;=、==、!=等等 纯面向对象实现,基本上可以代替系统int型使用。

    c/c++大数阶乘

    在编程领域,尤其是在C或C++中处理大数阶乘是一项挑战,因为这些语言的内置整型类型(如int、long、long long)在面对大数运算时可能会导致溢出。为了解决这个问题,我们可以使用数组来存储大数,并自定义算法来实现...

    C++大数运算源代码

    本篇将围绕标题"**C++大数运算源代码**"和描述中的内容,深入探讨如何在C++中实现大数运算。 首先,我们关注到压缩包内的两个文件:`杨闽-C语言大数预算程序.cpp`和`HugeInt.h`。`HugeInt.h`很可能是一个头文件,...

    C++大数库MPIR

    **C++大数库MPIR详解** MPIR(Multiple Precision Integers and Rationals)是一个高效、可移植的C++库,专为处理大整数和有理数设计。它支持超长整数运算,这对于在密码学、数学计算、科学计算以及需要处理大数的...

    C++ 大数乘法 一般算法

    ### C++大数乘法一般算法详解 #### 算法背景与应用场景 在计算机科学领域,特别是编程竞赛、加密算法、金融计算等场景中,经常需要处理超过标准整型或浮点型变量所能表示的大数。对于这些场景,传统的乘法运算不再...

    [Source Code]C++大数计算

    总之,`stringCalculate`提供的C++大数计算功能,是通过字符串或其他高效数据结构来存储和处理大整数,实现了大数的加、减、乘、除等基本运算。理解并运用这些算法和技巧,对于进行高级数值计算、密码学或游戏开发等...

    c++大数运算的基本思路

    在C++编程中,大数运算(大整数运算)是指处理超过标准整型变量所能表示范围的数值计算。为了实现大数运算,通常需要自定义数据结构和算法。以下是一个基于C++的大数运算的基本思路,以CUSuperInt类为例进行说明。 ...

    c++大数加法乘法源码

    以下是对“c++大数加法乘法源码”主题的详细解释: 首先,我们需要了解大数数据结构。一种常见的方法是使用数组存储每个位,从最低位到最高位。例如,我们可以用一个整数数组`int digits[]`来表示大数,数组中的每...

    C++大数问题

    在编程领域,尤其是在C++这样的语言中,处理大数(超过标准整型或浮点型所能表示的范围的数字)是一项挑战。大数问题通常涉及到对超出了常规数据类型限制的数值进行运算,如加法、减法、乘法和除法。在C++中,没有...

    c++大数模板,加减乘除阶乘求幂N进制

    以上就是关于"C++大数模板,加减乘除阶乘求幂N进制"的相关知识点。这些操作在密码学、分布式计算、金融计算等领域都有广泛应用。通过理解并掌握这些知识点,开发者可以编写高效且灵活的大数处理程序。

    C++大数四则运算(带符号及小数)

    大数四则运算还小数及正负符号,可实现2000位以内的四则运算,大于2000需改数组,经初步测试通过,传上交流下希望能给点意见以便不断改进

Global site tag (gtag.js) - Google Analytics