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

📄 function.h

📁 数据结构课程设计_任意大数的加减乘运算器
💻 H
字号:
/******************************* 消0操作 ********************************/
void cut_0(HugeNum *num)
{
	BiteNode *p1,*p2,*pt;
	p1=num->Highest;
	p2=num->Lowest;
	while(p1!=num->Dot&&p1->bite==0)
	{
		pt=p1;
		p1=p1->nextbite;
		p1->prebite=NULL;
		free(pt);
	}//while
	num->Highest=p1;//消除整数部分前面多余的0
	while(p2!=num->Dot&&p2->bite==0)
	{
		pt=p2;
		p2=p2->prebite;
		p2->nextbite=NULL;
		free(pt);
	}//while
	num->Lowest=p2;//消除小数部分后面的多余的0
}//cut_0
/**************************** 对大数进行取反操作 **************************************/
void Negative(HugeNum *num)
{
	BiteNode *p;
	p=num->Highest;
	while(p)
	{
		p->bite=0-p->bite;
		p=p->nextbite;
	}//while
}//Negative
/***************************************************************************/
void FinalResult(HugeNum* num,char c)
{
	int temp,up=0;//up表示进位
	BiteNode*p0,*p1;
	p1=num->Lowest;
	switch(c)
	{
		case '+':{
						while(p1)
						{
							if(p1->bite>=0)//非负数位的情况
							{
								temp=(p1->bite+up)%10;
								up=(p1->bite+up)/10;
								p1->bite=temp;
								p1=p1->prebite;
							}//if
							else//负数位的情况 
							{
								p1->bite=(100+p1->bite)%10;
								p1=p1->prebite;
								(p1->bite)--;
							}//else
						}//while		
					break;
				 }
		case '-':{
						while(p1)
						{
							if(p1->bite<=0)//非正数位的情况
							{
								temp=(0-p1->bite+up)%10;
								up=(0-p1->bite+up)/10;
								p1->bite=temp;
								p1=p1->prebite;
							}//if
							else//正数位的情况
							{
								p1->bite=(100-p1->bite)%10;
								p1=p1->prebite;
								(p1->bite)++;
							}//else
						}//while		
					break;
				 }
	}//switch
	if(up!=0)//进位非0,此时需要申请新的当空间来进位
	{
		while(up>0)
		{
			p0=(BiteNode*)malloc(sizeof(BiteNode));
			p0->bite=up%10;
			up=up-up%10;
			p0->nextbite=num->Highest;
			p0->prebite=NULL;
			num->Highest->prebite=p0;
			num->Highest=p0;
		}//while
		cut_0(num);//有必要再做一次消0操作
	}//if
}//FinalResult
/****************************** 加法器函数 ***************************************/
char Plus(HugeNum* Num1,HugeNum* Num2,HugeNum* Num3)
{
	BiteNode *p1,*p2,*pt,*p0=NULL;
	p1=Num1->Dot;p2=Num2->Dot;
	while(p1&&p2&&p1->nextbite&&p2->nextbite)
	{
		p1=p1->nextbite;
		p2=p2->nextbite;
	}
	if(p1&&p1->nextbite)//
		p0=p1->nextbite;
	if(p2&&p2->nextbite)
		p0=p2->nextbite;
	while(p0)
	{
		pt=(BiteNode*)malloc(sizeof(BiteNode));
		pt->bite=p0->bite;
		pt->prebite=Num3->Lowest;
		pt->nextbite=NULL;
		if(Num3->Highest==NULL)
			Num3->Highest=pt;	
		if(Num3->Lowest!=NULL)
			Num3->Lowest->nextbite=pt;
		Num3->Lowest=pt;
		p0=p0->nextbite;
	}//while
	while(p1&&p2)
	{
		pt=(BiteNode*)malloc(sizeof(BiteNode));
		pt->bite=p1->bite+p2->bite;
		if(Num3->Dot==NULL&&p1==Num1->Dot)
			Num3->Dot=pt;
		if(Num3->Lowest==NULL)
			Num3->Lowest=pt;
		pt->prebite=NULL;
		pt->nextbite=Num3->Highest;
		if(Num3->Highest!=NULL)	
			Num3->Highest->prebite=pt;
		Num3->Highest=pt;
		p1=p1->prebite;	
		p2=p2->prebite;	
	}//while
	p0=NULL;
	if(p1)
		p0=p1;
	if(p2)
		p0=p2;
	while(p0)
	{
		pt=(BiteNode*)malloc(sizeof(BiteNode));
		pt->bite=p0->bite;
		pt->prebite=NULL;
		pt->nextbite=Num3->Highest;
		if(Num3->Highest)
			Num3->Highest->prebite=pt;
		Num3->Highest=pt;
		if(Num3->Lowest==NULL)
			Num3->Lowest=pt;
		if(Num3->Dot==NULL)
			Num3->Dot=pt;
		p0=p0->prebite;
	}//while
		cut_0(Num3);//////////////

		if(Num3->Highest&&Num3->Highest->bite>0||!Num3->Highest)//根据加和后最高项的符号决定该大数的符号
			{Num3->NP=1;return('+');}
		else if(Num3->Highest==Num3->Dot)
			{
				p0=Num3->Dot;
				while(p0&&p0->bite==0)
					p0=p0->nextbite;
				if(!p0||p0->bite>0)  return('+');
				else {Num3->NP=-1;return('-');}
			}
			else
				{Num3->NP=-1;return('-');}
}
/****************************** 初始化大数的函数 ***************************************/
void InitNum(HugeNum * num)
{
	num->Dot=num->Lowest=num->Highest=NULL;
	num->NP=1;//默认值为正数
}//InitNum
/******************************** 构造大数的函数 ***************************************/
int BuildHugeNum(HugeNum *num)
{
	FILE *fp;
	BiteNode *p=NULL;
	char c;
	char filename[20]={'\0'};
	getname:gets(filename);
	fp=fopen(filename,"r");
	if(!fp) { printf("打开文件失败!请重新输入\n");goto getname;}
	printf("打开文件成功!\n");
	fscanf(fp,"%c",&c);//读数,以字符形式读取
	while(!feof(fp))
	{
		if(c=='-')
		{num->NP=-1;fscanf(fp,"%c",&c);continue;}
		if(c=='.')
		{num->Dot=p;fscanf(fp,"%c",&c);continue;}
		p=(BiteNode*)malloc(sizeof(BiteNode));//申请新的空间存数位值
		p->bite=c-'0';
		p->nextbite=NULL;
		p->prebite=num->Lowest;
		if(num->Lowest!=NULL)
			num->Lowest->nextbite=p;
		num->Lowest=p;
		if(num->Highest==NULL)
			num->Highest=p;
		fscanf(fp,"%c",&c);
	}//while
	fclose(fp);
	if(num->Dot==NULL)//读取的大数是整数
		num->Dot=num->Lowest;
	return 1;
}//BuildHugeNum
/****************************** 加减法函数 ***************************************/
void Plus_or_Minus(HugeNum *Num1,HugeNum *Num2,HugeNum *Num3,char op)
{
	int OP;
	char c;
	OP=(op=='+')?1:-1;//加法置为1,减法置为-1
	switch((Num1->NP)*(Num2->NP)*OP)
	{
		case 1:{	
					switch(Num1->NP)
					{
						case 1: {//第1,2两种情况
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									cut_0(Num3);
									break;
								}
						case -1:{//第7,8两种情况
									Negative(Num1);
									Negative(Num2);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									cut_0(Num3);
									Negative(Num1);
									Negative(Num2);
									break;
								}
					}//				
					break;
			   }//case 1
		case -1:{
					switch(Num1->NP)
					{
						case 1: {//第3,5两种情况
									Negative(Num2);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									cut_0(Num3);
									Negative(Num2);
									break;
								}
						case -1:{//第4,6两种情况
									Negative(Num1);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									cut_0(Num3);
									Negative(Num1);
									break;
								}
					}
					break;
				}//case -1
	}//switch
}//Plus_or_Muil
/******************************************************************************/
void PrintNum(HugeNum num,char filename[])
{
	BiteNode *p;
	FILE*fp;
	fp=fopen(filename,"w+");
	if(num.Highest==NULL) 
	{	fprintf(fp,"0");printf("0");fclose(fp);return;}
	if(num.NP==-1)
	{
		printf("-");
		fprintf(fp,"-");
	}
	for(p=num.Highest;p!=NULL;p=p->nextbite)
	{
		printf("%d",p->bite);fprintf(fp,"%d",p->bite);
		if(p==num.Dot&&num.Dot!=num.Lowest)
		{printf(".");fprintf(fp,".");}
	}
	fclose(fp);
}
/******************************************************************************/
void ReInit(HugeNum* num)//
{
	BiteNode* p,*pt;
	p=num->Highest;
	while(p)
	{
		pt=p;
		p=p->nextbite;
		free(pt);
	}
	num->Dot=num->Highest=num->Lowest=NULL;
	num->NP=1;
}//
/***************************************************************************/
void Transbite(HugeNum* temp,char c)
{
	BiteNode *pt;
	switch(c)
		{
			case 'u':
					{
						if(temp->Dot&&temp->Dot->prebite==NULL)//
						{
							pt=(BiteNode*)malloc(sizeof(BiteNode));
							pt->bite=0;
							pt->prebite=NULL;
							pt->nextbite=temp->Highest;
							temp->Highest->prebite=pt;
							temp->Dot=pt;
						}
						else if(!temp->Dot)
							{
								pt=(BiteNode*)malloc(sizeof(BiteNode));
								pt->bite=0;
								pt->nextbite=NULL;
								pt->prebite=NULL;
								temp->Lowest=temp->Highest=temp->Dot=pt;
							}
							else//
								temp->Dot=temp->Dot->prebite;
						break;
					}
			case 'd':
				{
						if(temp->Dot&&temp->Dot->nextbite==NULL)//
						{
							pt=(BiteNode*)malloc(sizeof(BiteNode));
							pt->bite=0;
							pt->prebite=temp->Lowest;
							pt->nextbite=NULL;
							temp->Lowest->nextbite=pt;
							temp->Lowest=pt;
							temp->Dot=pt;
						}
						else if(!temp->Dot)
							{
								pt=(BiteNode*)malloc(sizeof(BiteNode));
								pt->bite=0;
								pt->nextbite=NULL;
								pt->prebite=NULL;
								temp->Lowest=temp->Highest=temp->Dot=pt;
							}
							else//
								temp->Dot=temp->Dot->nextbite;						
						break;
				}
		}
}//
/**********************************************************************************/
void Muilt(HugeNum* Num1,HugeNum* Num2,HugeNum* Num3)//
{
	int IsDot=0,i,j,I=0,BiteNum=0;
	HugeNum NUM[11],Temp[2];
	BiteNode *p,*pt;
	for(i=0;i<2;i++)
		InitNum(&Temp[i]);
	if(Num1->NP*Num2->NP==-1)
		Num3->NP=-1;//
	Num1->NP=Num2->NP=1;//
	for(p=Num2->Lowest;p!=NULL;p=p->prebite)
	{
		for(i=0;i<11;i++)
			InitNum(&NUM[i]);
		for(i=1;i<=p->bite;i++)
			Plus_or_Minus(Num1,&NUM[i],&NUM[i+1],'+');
		if(IsDot==0)
			{
				Plus_or_Minus(&NUM[i],&Temp[I],&Temp[(I+1)%2],'+');						
				ReInit(&Temp[I]);I=(I+1)%2;
				if(p!=Num2->Dot)  Transbite(&Temp[I],'u');//
			}//if
		else	
			{
				for(j=1;j<=BiteNum;j++)
					Transbite(&NUM[i],'d');
				Plus_or_Minus(&NUM[i],&Temp[I],&Temp[(I+1)%2],'+');
				ReInit(&Temp[I]);I=(I+1)%2;
				BiteNum++;
			}
		if(p==Num2->Dot)
		{IsDot=1;BiteNum++;}
	}//for
	for(p=Temp[I].Highest;p!=NULL;p=p->nextbite)
	{
		pt=(BiteNode*)malloc(sizeof(BiteNode));
		pt->bite=p->bite;
		if(Num3->Highest==NULL)
			Num3->Highest=pt;
		if(p==Temp[I].Dot)
			Num3->Dot=pt;
		pt->prebite=Num3->Lowest;
		pt->nextbite=NULL;
		if(Num3->Lowest!=NULL)
			Num3->Lowest->nextbite=pt;
		Num3->Lowest=pt;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -