📄 function.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 + -