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