分别使用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++标准库并未提供内置的大数支持,因此要实现大数相加减的功能,通常需要自定义数据结构和算法。这个项目"BigNumberAdd"显然是关于如何用C++来实现大数加法和减法的示例。 首先,我们要创建一个表示大数的数据结构...
封装好的C++大数类,很全面,包括运算符重载,大数的加、减、乘、除
在标题“gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度”中,我们关注的是用C语言和C++实现的高精度算法,特别是大数的加法、减法、乘法和除法。这些操作是基础数学运算,但在计算机中...
这个"简单的C++大数类"是作者自定义实现的一个C++库,专门用于处理大数运算。以下是对这个类的一些关键知识点的详细说明: 1. **大数表示**:大数类通常使用数组或链表存储多位数字,每个元素代表一个位。在这个C++...
本项目“C++大数计算简单实例测试”提供了一个基本的解决方案,用于进行大数的算术运算,如加法、减法、乘法等。以下将详细介绍该实例所涵盖的C++知识点。 1. **自定义数据结构**: 在C++中,由于没有内置的大数...
c++大数模板 内含各种大数操作 还可以自己设置数的长度
大数类C++实现详解 大数类是一个重要的数据结构在计算机科学中,它可以用来表示非常大的整数,通常超过了机器字长的限制。在C++中,可以通过重载运算符和实现自定义的整数类来实现大数类。 在这个示例代码中,我们...
用c++实现大数加减乘,绝对可以实现。希望分享
在C++编程中,处理大数(通常超过标准整型或浮点型所能表示的范围)的除法是一项挑战,特别是在需要保持精确性时,如本例中的100位大数除法并保留100位小数。C++标准库并不直接支持这种操作,因此我们需要自定义算法...
实现各种常用的运算法则,如+、-、*、/、%、++、--、+=、-=、*=、%=、/=、>、<、、>=、==、!=等等 纯面向对象实现,基本上可以代替系统int型使用。
在编程领域,尤其是在C或C++中处理大数阶乘是一项挑战,因为这些语言的内置整型类型(如int、long、long long)在面对大数运算时可能会导致溢出。为了解决这个问题,我们可以使用数组来存储大数,并自定义算法来实现...
本篇将围绕标题"**C++大数运算源代码**"和描述中的内容,深入探讨如何在C++中实现大数运算。 首先,我们关注到压缩包内的两个文件:`杨闽-C语言大数预算程序.cpp`和`HugeInt.h`。`HugeInt.h`很可能是一个头文件,...
**C++大数库MPIR详解** MPIR(Multiple Precision Integers and Rationals)是一个高效、可移植的C++库,专为处理大整数和有理数设计。它支持超长整数运算,这对于在密码学、数学计算、科学计算以及需要处理大数的...
### C++大数乘法一般算法详解 #### 算法背景与应用场景 在计算机科学领域,特别是编程竞赛、加密算法、金融计算等场景中,经常需要处理超过标准整型或浮点型变量所能表示的大数。对于这些场景,传统的乘法运算不再...
总之,`stringCalculate`提供的C++大数计算功能,是通过字符串或其他高效数据结构来存储和处理大整数,实现了大数的加、减、乘、除等基本运算。理解并运用这些算法和技巧,对于进行高级数值计算、密码学或游戏开发等...
在C++编程中,大数运算(大整数运算)是指处理超过标准整型变量所能表示范围的数值计算。为了实现大数运算,通常需要自定义数据结构和算法。以下是一个基于C++的大数运算的基本思路,以CUSuperInt类为例进行说明。 ...
以下是对“c++大数加法乘法源码”主题的详细解释: 首先,我们需要了解大数数据结构。一种常见的方法是使用数组存储每个位,从最低位到最高位。例如,我们可以用一个整数数组`int digits[]`来表示大数,数组中的每...
在编程领域,尤其是在C++这样的语言中,处理大数(超过标准整型或浮点型所能表示的范围的数字)是一项挑战。大数问题通常涉及到对超出了常规数据类型限制的数值进行运算,如加法、减法、乘法和除法。在C++中,没有...
以上就是关于"C++大数模板,加减乘除阶乘求幂N进制"的相关知识点。这些操作在密码学、分布式计算、金融计算等领域都有广泛应用。通过理解并掌握这些知识点,开发者可以编写高效且灵活的大数处理程序。
大数四则运算还小数及正负符号,可实现2000位以内的四则运算,大于2000需改数组,经初步测试通过,传上交流下希望能给点意见以便不断改进