📄 suintegerclass.cpp
字号:
#include "stdafx.h"
#include "iostream.h"
#include "SuIntegerClass.h"
bool SuInteger::insert_head(char bitdata)
{
Node *new_node;
new_node=new Node;
new_node->next=head;
new_node->BitData=bitdata;
head=new_node;
this->count++;
return true;
}
bool SuInteger::insert_tail(char bitdata)
{
Node *point,*new_node;
new_node=new Node;
new_node->next=NULL;
new_node->BitData=bitdata;
point=head;
if (point)
{
while(point->next) point=point->next;
point->next=new_node;
}
else
{
head=new_node;
}
this->count++;
return true;
}
SuInteger::SuInteger()
{
head=NULL;
sign=0;
count=0;
}
SuInteger::SuInteger(SuInteger *tmp_next)
{
Node *p;
head=NULL;
p=tmp_next->head;
while(p)
{
this->insert_tail(p->BitData);
p=p->next;
}
sign=tmp_next->sign;
count=tmp_next->count;
}
void SuInteger::print()
{
SuInteger tmp;
Node *p;
bool enprint=false;
p=this->head;
while(p)
{
tmp.insert_head(p->BitData);
p=p->next;
}
p=tmp.head;
if(this->sign) cout<<'-';
while(p)
{
if(p->BitData!=0) enprint=true;
if(enprint) cout<<char(p->BitData+'0');
p=p->next;
}
cout<<endl;
}
SuInteger SuInteger::add(SuInteger &source, int &cntnum)
{
SuInteger tmp;
Node *p1,*p2;
char carry=0;
char tmpdata;
cntnum=0;
p1=this->head;
p2=source.head;
while(p1 && p2)
{
tmpdata=(p1->BitData+p2->BitData+carry)%10;
carry=(p1->BitData+p2->BitData+carry)/10;
tmp.insert_tail(tmpdata);
p1=p1->next;
p2=p2->next;
cntnum++;
}
while(p1)
{
tmpdata=(p1->BitData+carry)%10;
carry=(p1->BitData+carry)/10;
tmp.insert_tail(tmpdata);
p1=p1->next;
cntnum++;
}
while(p2)
{
tmpdata=(p2->BitData+carry);
tmpdata=(p2->BitData+carry)%10;
carry=(p2->BitData+carry)/10;
tmp.insert_tail(tmpdata);
p2=p2->next;
cntnum++;
}
if(carry) tmp.insert_tail(carry);
return tmp;
}
SuInteger SuInteger::sub(SuInteger &source, int &cntnum)
{
SuInteger tmp;
int cnt1,cnt2;
if (this->larger(source,cnt1))
{
tmp=this->ABSsub(source,cnt2);
}
else
{
tmp=source.ABSsub(*this,cnt2);
tmp.sign=1;
}
cntnum=cnt1+cnt2;
return tmp;
}
SuInteger SuInteger::ABSsub(SuInteger &source, int &cntnum)
{
SuInteger tmp;
Node *p1,*p2;
char carry=0;
char tmpdata;
cntnum=0;
p1=this->head;
p2=source.head;
while(p1 && p2)
{
tmpdata=(p1->BitData-p2->BitData-carry);
if(tmpdata>=0)
{
carry=0;
}
else
{
carry=1;
tmpdata=10+tmpdata;
}
tmp.insert_tail(tmpdata);
p1=p1->next;
p2=p2->next;
cntnum++;
}
while(p1)
{
tmpdata=(p1->BitData-carry);
if(tmpdata>=0)
{
carry=0;
}
else
{
carry=1;
tmpdata=10+tmpdata;
}
tmp.insert_tail(tmpdata);
p1=p1->next;
cntnum++;
}
return tmp;
}
SuInteger SuInteger::mul(SuInteger &source, int &cntnum)
{
SuInteger tmp_sum;
Node *upper,*lower;
int cnt=0,i;
char tmpdata;
char carry=0;
int tmpint,cnt1=0,cnt2=0;
lower=source.head;
while (lower)
{
SuInteger tmp(this);
carry=0;
upper=tmp.head;
while(upper)
{
tmpdata=(upper->BitData*lower->BitData+carry)%10;
carry=(upper->BitData*lower->BitData+carry)/10;
upper->BitData=tmpdata;
upper=upper->next;
cnt1++;
}
if(carry) tmp.insert_tail(carry);
for(i=0; i<cnt; i++) tmp.insert_head(0);
tmp_sum=tmp_sum.add(tmp,tmpint);
cnt2+=tmpint;
tmp.clear();
cnt++;
lower=lower->next;
}
cntnum=cnt1+cnt2;
return tmp_sum;
}
void SuInteger::clear()
{
Node *p;
while(head)
{
p=head;
head=head->next;
delete p;
}
}
SuInteger SuInteger::exp(SuInteger &source, int &cntnum)
{
SuInteger tmp_return,count(source),tmp;
int cnt;
cntnum=0;
tmp.insert_head(1);
tmp_return.insert_head(1);
while(!count.IsEmpty())
{
tmp_return=tmp_return.mul(*this,cnt);
cntnum+=cnt;
count=count.sub(tmp,cnt);
}
return tmp_return;
}
bool SuInteger::IsEmpty()
{
Node *p;
p=head;
while(p)
{
if(p->BitData!=0) return false;
p=p->next;
}
return true;
}
bool SuInteger::larger(SuInteger &source, int &cntnum)
{
SuInteger tmp;
Node *p1,*p2;
char d1,d2;
cntnum=0;
if (this->count>source.count)
{
return true;
}
else if (this->count==source.count)
{
p1=this->head;
p2=source.head;
while(p1)
{
d1=p1->BitData;
d2=p2->BitData;
p1=p1->next;
p2=p2->next;
cntnum++;
}
if (d1>d2) return true;
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -