大树加法、乘法
来源:互联网 发布: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;
}
#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;
}
- 大树加法、乘法
- POJ 1001 Exponentiation(大树乘法)
- 大树
- 大数加法和乘法
- 大数加法乘法
- 高精度加法,乘法,阶乘
- 多项式加法、乘法
- 大数减法、加法、乘法
- 加法原理乘法原理
- 高精度加法与乘法
- 高精度加法乘法类
- 大数加法和乘法
- 大数加法与乘法
- js 加法 乘法
- 高精度加法和乘法
- 大数加法+乘法
- 加法变乘法
- 1006-加法变乘法
- linux fsck命令参数及用法详解---检查修复linux文件系统命令fsck
- flash player 可靠源已经损坏
- 众说纷纭:ScrollView中包含ListView
- OK6410、2.6.36内核移植,dm9000 驱动移植,详细!
- Html5 的 SVG功能介绍
- 大树加法、乘法
- Windows中各种日志文件和IIS日志文件的分析
- fsck解决Linux数据丢失问题
- BroadCastReceiver android 广播接收器
- 论坛项目记录
- 声明顺序
- 关于JAVA多线程编程的一点笔记
- 黑马程序员-泛型
- 可以ping通但上不了网