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

📄 function.c

📁 数据结构课程设计_任意大数的加减乘运算器
💻 C
字号:
/******************************* 消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;
		free(pt);
	}//while
	num->Highest=p1;//消除整数部分前面多余的0
	while(p2!=num->Dot&&p2->bite==0)
	{
		pt=p2;
		p2=p2->prebite;
		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;
			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;
	p1=Num1->Dot;
	Num3->Dot=p1;
	p2=Num2->Dot;
	while(p1->nextbite&&p2->nextbite)
	{
		p1=p1->nextbite;
		p2=p2->nextbite;		
	}//while
	if(p2->nextbite)//Num2没有走完时(Num1不考虑)
	{
		p1->nextbite=p2->nextbite;//将Num2中多余结点链到Num1的后面(链上后链)
		while(p2->nextbite)
			p2=p2->nextbite;
		Num3->Lowest=p2;//Num3的最低位找到
		p2=p1->nextbite->prebite;//p2回到原来Num2的位置
		p2->nextbite->prebite=p1;//链上前链
	}
	else Num3->Lowest=Num1->Lowest;//Num3的最低位找到
	while(p1&&p2)//往前走,并进行加和操作
	{
		p1->bite=p1->bite+p2->bite;
		pt=p2;
		p1=p1->prebite;
		p2=p2->prebite;
		free(pt);//释放Num2中多余的结点
	}//while
	if(p2)//若Num2未空,需要将Num2前面剩余的结点链到Num1的前面
	{
		p2->nextbite=Num1->Highest;
		Num1->Highest->prebite=p2;
		Num3->Highest=Num2->Highest;//在此情况下Num3的最高位找到
	}//if 

	else//Num2空(但Num1可能空,也可能未空)
	{Num3->Highest=Num1->Highest;}//此情况下Num3的最高位找到
	cut_0(Num3);//消除整数部分前面或者小数部分后面的无效0

	if(Num3->Highest->bite>=0)//根据加和后最高项的符号决定该大数的符号
		{Num3->NP=1;return('+');}
	else
		{Num3->NP=-1;return('-');}

}//Plus
/****************************** 初始化大数的函数 ***************************************/
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'};
	printf("请输入大数所在的文件:\n");
	gets(filename);
	fp=fopen(filename,"r");
	if(!fp) { 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两种情况
									if(Num2->NP==-1)//第二个数为负数(即第2种情况)
										Negative(Num2);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									break;
								}
						case -1:{//第7,8两种情况
									Negative(Num1);
									Negative(Num2);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									break;
								}
					}//
				
					break;
			   }//case 1
		case -1:{
					switch(Num1->NP)
					{
						case 1: {//第3,5两种情况
									Negative(Num2);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									break;
								}
						case -1:{//第4,6两种情况
									Negative(Num1);
									if(Num2->NP==-1)
										Negative(Num2);
									c=Plus(Num1,Num2,Num3);
									FinalResult(Num3,c);
									break;
								}


					}
					break;
				}//case -1
	}//switch
}//Plus_or_Muil




/******************************************************************************/
void PrintNum(HugeNum num)
{
	BiteNode *p;
	if(num.NP==-1)
		printf("-");
	for(p=num.Highest;p!=NULL;p=p->nextbite)
	{
		printf("%d",p->bite);
		if(p==num.Dot&&num.Dot!=num.Lowest)
			printf(".");
	}
}

⌨️ 快捷键说明

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