大树加法、乘法

来源:互联网 发布:sql文件 编辑:程序博客网 时间:2024/04/25 07:51
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 300  //大整数最大位数
//c语言结构体没有方法,只能是数据的集合
class Bign{
private:
int len; //大整数位数
int pos[MAXN];//大整数的存储结构,pos[0]表示个位······
public:
//无参构造函数
  Bign(){
  len=0;
  memset(pos,0,sizeof(pos));
  trim();
  }
  //赋值构造函数
  Bign(const Bign& a){
  this->len=a.len;
  memcpy(this->pos,a.pos,sizeof(a.pos));
  trim();
  }
  Bign(const char* str){  //构造函数不能调用无参构造函数
  len=0;
  memset(pos,0,sizeof(pos));
  for(int i=strlen(str)-1;i>=0;i--)
  pos[len++]=str[i]-'0';
  trim();
  }
  //赋值函数 改变的是自己
  Bign& operator= (const Bign &a){
  this->len=a.len;
  memcpy(this->pos,a.pos,sizeof(a.pos));
  trim();
  }
  Bign& operator= (const char* str){
  len=0;
  memset(pos,0,sizeof(pos));
  for(int i=strlen(str)-1;i>=0;i--)
  pos[len++]=str[i]-'0';
  trim();
  }
  //去掉前置零
  void trim(){
  int i;
  for(i=len-1;i>=0;i--) if(pos[i]!=0) break;
  if(i<0) len=1;
  else if(i+1<len) len=i+1;
  }
  //加法运算 不改变自己
  friend Bign operator+(const Bign& a,int cnt);
  friend Bign operator+(const Bign& a,const Bign& b);
  //乘法运算
  friend Bign operator*(const Bign& a,const Bign& b);
  friend Bign operator*(const Bign& a,int cnt);
  //重载输出函数
  friend ostream& operator<< (ostream &out,Bign &a);
  int getLen(){return len;}
};
//模拟小学生列竖式做加法
Bign operator+(const Bign &a,const Bign& b){
int car=0;    //记录进位
Bign c;
c.len=(a.len>b.len)?a.len:b.len;
for(int i=0;i<c.len;i++){
c.pos[i]=(a.pos[i]+b.pos[i]+car)%10;   
car=(a.pos[i]+b.pos[i]+car)/10;
}if(car==1) c.pos[c.len++]=car;//若最后有进位,则c.len要加1
c.trim();
return c;
}
Bign operator+(const Bign &a,int cnt){
int car=0;    //记录进位
Bign c;
char str[300];//不能使用char *str; 因为指针str没有指向的空间
sprintf(str,"%d",cnt);
Bign b(str);
c.len=(a.len>b.len)?a.len:b.len;
for(int i=0;i<c.len;i++){
c.pos[i]=(a.pos[i]+b.pos[i]+car)%10;   
car=(a.pos[i]+b.pos[i]+car)/10;
}if(car==1) c.pos[c.len++]=car;//若最后有进位,则c.len要加1
c.trim();
return c;
}
//乘法运算
Bign operator*(const Bign &a,const Bign &b){
Bign c;
for(int i=0;i<b.len;i++)
for(int j=0;j<a.len;j++)
c.pos[i+j]+=b.pos[i]*a.pos[j];
for(int k=0;k<a.len+b.len-1;k++)  //最后处理进位问题
if(c.pos[k]>=10){
c.pos[k+1]+=c.pos[k]/10;
c.pos[k]%=10;
}
c.len=a.len+b.len;
c.trim();
return c;
}
Bign operator*(const Bign &a,int cnt){
int car=0;    //记录进位
Bign c;
char str[300];//不能使用char *str; 因为指针str没有指向的空间
sprintf(str,"%d",cnt);
Bign b(str);
for(int i=0;i<b.len;i++)
for(int j=0;j<a.len;j++)
c.pos[i+j]+=b.pos[i]*a.pos[j];
for(int k=0;k<a.len+b.len-1;k++)
if(c.pos[k]>=10){
c.pos[k+1]+=c.pos[k]/10;
c.pos[k]%=10;
}
c.len=a.len+b.len;
c.trim();
return c;
}
ostream& operator<< (ostream &out,Bign &a){
for(int i=a.len-1;i>=0;i--){
out<<a.pos[i];
}
return out;
}


int main(){
return 0;
}
原创粉丝点击