/******************************************************************************************************
1.题目
实现大整数的基本操作
2.要求
实现大整数的基本操作。基本操作包括:加法、减法、取模、移位等。
******************************************************************************************************/
#include<iostream>
#include<string>
using namespace std;
const int maxsize=1000;
/******************************************************************************************************
大整数类的定义
******************************************************************************************************/
class Crypdata
{
public:
char m_int[maxsize];
int length;
Crypdata(char *p=NULL);
Crypdata(const Crypdata &c);
Crypdata::Crypdata(long n);
void sinmult(int offset,char str1,const char *str2,int n,char *dest);//一位乘法,供多位乘法调用
void mult(const char *str1,const char *str2,int n1,int n2,char *dest);//乘法实现主程序
void sub(const char *str1,int n1,const char *str2,int n2,char *dest);//减法实现主程序
void sum(const char *str1,int n1,const char *str2,int n2,char *dest);//加法实现主程序
Crypdata abs()const;//返回绝对值
friend ostream&operator<<(ostream &dirt,Crypdata &iv);//输出
friend istream&operator>>(istream &dirt,Crypdata &iv);//输入
Crypdata Crypdata::operator =(Crypdata n);//重载等号
Crypdata left(Crypdata &n,int val);
Crypdata right(Crypdata &n,int val);
Crypdata and(Crypdata &m,Crypdata &n);
Crypdata or(Crypdata &m,Crypdata &n);
Crypdata nor(Crypdata &m,Crypdata &n);
bool operator>(const Crypdata &n);
bool operator<(const Crypdata &n);
bool operator==(const Crypdata &n);
Crypdata operator-(const Crypdata &n);
Crypdata operator-(long n);
Crypdata operator-()const;//重载负号
Crypdata operator+(const Crypdata &n);
Crypdata operator+(long n);
Crypdata operator*(long n);
Crypdata operator*(const Crypdata &n);
Crypdata operator/(long n);
Crypdata operator/(const Crypdata &n);
Crypdata operator%(const Crypdata &n);
string toString();//转化为字条串
void init(char *p);//用字串初始化
};
bool bin(const Crypdata &n);
Crypdata::Crypdata(char *p)
{
if(p==NULL)
{
for(int i=1;i<maxsize-1;i++)
m_int[i]=0;
m_int[0]='+';
length=1;
}
else
{
length=strlen(p);
int i=0;
if(p[0]!='-')
{
for(i=1;i<=length;i++)
m_int[i]=p[i-1]-48;
m_int[0]='+';
}
else
{
for(i=1;i<length;i++)
m_int[i]=p[i]-48;
m_int[0]='-';
length--;
}
for(i;i<maxsize;i++)
{
m_int[i]=0;
}
}
}
/******************************************************************************************************
long型数据转化为大整数
******************************************************************************************************/
Crypdata::Crypdata(long n)
{
long j=0,m=n;
while((m/10)!=0)
{
j++;
m=m/10;
}
length=j+1;
while((n/10)!=0)
{
m_int[j+1]=n%10;
j--;
n=n/10;
}
m_int[1]=n;
if(n>=0)
m_int[0]='+';
else
m_int[0]='-';
}
void Crypdata::init(char *p)
{
length=strlen(p);
int i=1;
if(p[0]!='-')
{
for(i=1;i<=length;i++)
m_int[i]=p[i-1]-48;
m_int[0]='+';
}
else
{
for(i=1;i<=length;i++)
m_int[i]=p[i]-48;
m_int[0]='-';
length--;
}
for(i;i<maxsize;i++)
m_int[i]=0;
}
Crypdata::Crypdata(const Crypdata &c)
{
for(int i=0;i<=c.length;i++)
m_int[i]=c.m_int[i];
length=c.length;
}
string Crypdata::toString()
{
string str(length+1,'\0');
if(m_int[0]=='+')
{
for(int j=0;j<length;j++)
str[j]=m_int[j+1]+48;
}
else
{
for(int j=1;j<=length;j++)
str[j]=m_int[j]+48;
str[0]='-';
}
return str;
}
void Crypdata::sinmult(int offset,char str1,const char *str2,int n,char *dest)//一位的整数str1(0-9)与str2相乘把结果把到dest的offset位上
{
int inc=0,i,x;
i=n-1;
while(i>=0)
{
x=str2[i]*str1+inc+dest[offset];
dest[offset]=x%10;
inc=x/10;
i--;
offset++;
}
while(inc)
{
x=dest[offset]+inc;
dest[offset]=x%10;
inc=x/10;
offset++;
}
}
void Crypdata::mult(const char *str1,const char *str2,int n1,int n2,char *dest)
{
int i=n1-1;
while(i>=0)
{
sinmult(n1-i-1,str1[i],str2,n2,dest);
i--;
}
}
/******************************************************************************************************
大整数类的乘法
******************************************************************************************************/
Crypdata Crypdata::operator *(const Crypdata &n)
{
Crypdata temp;
char dest[maxsize]={0};
int i=0,j=0;
mult(m_int+1,n.m_int+1,length,n.length,dest);
for(i=maxsize-1;i>=0;i--)
if(dest[i]!=0)
break;
temp.length=i+1;
for(j=0;j<=i;j++)
temp.m_int[j+1]=dest[i-j];
if(m_int[0]!=n.m_int[0])
temp.m_int[0]='-';
else
temp.m_int[0]='+';
return temp;
}
/******************************************************************************************************
大整数类的除法
******************************************************************************************************/
Crypdata Crypdata::operator /(const Crypdata &n)
{
Crypdata div1=abs(),div2=n.abs(),result;
int flag=0;
if(m_int[0]==n.m_int[0])
flag='+';
else
flag='-';
if(div1<div2) //被除数小于除数,值为0
{
result.m_int[0]='+';
result.m_int[1]=0;
result.length=1;
return result;
}
result.m_int[0]=flag;
if(div1==div2) //被除数等于除数,商为1
{
result.m_int[0]=flag;
result.m_int[1]=1;
result.length=1;
return result;
}
int len1=div1.length,len2=div2.length,len3,temp=0;
int i=1;
for(i=1;i<=len2;i++)
{
if(div1.m_int[i]>div2.m_int[i])
{
result.length=len1-len2+1;
break;
}
if(div1.m_int[i]<div2.m_int[i])
{
result.length=len1-len2;
break;
}
}
if(i>len2)
result.length=len1-len2+1;
len3=result.length;
while(div1>div2||div1==div2)
{
for(i=1;i<=len2;i++)
{
if(div1.m_int[i]>div2.m_int[i])
{
temp=len1-len2+1;
break;
}
if(div1.m_int[i]<div2.m_int[i])
{
temp=len1-len2;
break;
}
}
if(i>len2)
temp=len1-len2+1;
result.m_int[len3-temp+1]=result.m_int[len3-temp+1]+1;
div2.length=div2.length+temp-1;
div1=div1-div2;
div2.length=len2;
len1=div1.length;
}
return result;
}
Crypdata Crypdata::operator /(long n)
{
return (*this)/Crypdata(n);
}
/******************************************************************************************************
大整数类的赋值
******************************************************************************************************/
Crypdata Crypdata::operator =(const Crypdata n)
{
for(int i=0;i<=n.length;i++)
m_int[i]=n.m_int[i];
for(int s=n.length+1;s<=length;s++)
m_int[s]=0;
length=n.length;
return n;
}
Crypdata Crypdata::operator *(long n)
{
return (*this)*Crypdata(n);
}
Crypdata Crypdata::operator +(long n)
{
return *this+Crypdata(n);
}
/******************************************************************************************************
大整数类的大于比较
******************************************************************************************************/
bool Crypdata::operator>(const Crypdat
评论0