⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 suintegerclass.cpp

📁 This a code about the practice of super integar.
💻 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 + -